欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android BottomNavigationView與Fragment重建與重疊問題解決方法探索

 更新時間:2023年01月17日 08:32:50   作者:FranzLiszt1847  
這篇文章主要介紹了Android BottomNavigationView與Fragment重建與重疊問題解決,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路

簡介

在BottomNavigationView+多個Fragment框架下,進行Fragment切換時,會導致Fragment重建,也會出現(xiàn)同級Fragment未hide,導致重疊

解決方法

第一步

初始化一個默認需要顯示的Fragment頁面

public void InitFragment(Bundle savedInstanceState) {
        //判斷activity是否重建,如果不是,則不需要重新建立fragment.
        if (savedInstanceState == null) {
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            if (mMovie == null) {
                mMovie = new HomeFragment();
            }
            CurrentFragment = mMovie;
            fragmentTransaction.replace(R.id.nav_host_fragment_activity_main, mMovie).commit();//fragment parent layout id
        }
    }

第二步

監(jiān)聽BottomNavigationView切換事件

 binding.navView.setOnNavigationItemSelectedListener(listener);

對同級每一個Fragment進行監(jiān)聽,當進行切換的時候,對其狀態(tài)進行show或者hide

private BottomNavigationView.OnNavigationItemSelectedListener listener = new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull @NotNull MenuItem item) {
            switch (item.getItemId()) {
                case R.id.navigation_home:
                    if (mMovie == null) {
                        mMovie = new HomeFragment();
                    }
                    switchContent(CurrentFragment, mMovie);
                    return true;
                case R.id.navigation_dashboard:
                    if (mExplore == null) {
                        mExplore = new ExploreFragment();
                    }
                    switchContent(CurrentFragment, mExplore);
                    return true;
                case R.id.navigation_notifications:
                    if (mLibrary == null) {
                        mLibrary = new LibraryFragment();
                    }
                    switchContent(CurrentFragment, mLibrary);
                    return true;
                case R.id.navigation_member:
                    if (mMember == null) {
                        mMember = new MemberFragment();
                    }
                    switchContent(CurrentFragment, mMember);
                    return true;
            }
            return false;
        }
    };

第三步

此為對原Fragment進行隱藏,對要跳轉(zhuǎn)的Fragment進行show,防止頁面重疊

public void switchContent(Fragment from, Fragment to) {
        if (from == null || to == null) return;
        if (CurrentFragment != to) {
            CurrentFragment = to;
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            if (!to.isAdded()) {  
                //fragment parent layout id
                fragmentTransaction.hide(from).add(R.id.nav_host_fragment_activity_main, to).commit(); 
            } else {
                fragmentTransaction.hide(from).show(to).commit(); 
            }
        }
    }

使用

    private FragmentManager fragmentManager;
    private FragmentTransaction fragmentTransaction;
    private HomeFragment mMovie = null;
    private ExploreFragment mExplore = null;
    private LibraryFragment mLibrary = null;
    private MemberFragment mMember = null;
    private Fragment CurrentFragment = null;
  InitFragment(savedInstanceState);
 binding.navView.setOnNavigationItemSelectedListener(listener);

同級Fragment跳轉(zhuǎn)

當BottomNavigationView中的同級Fragment需要進行跳轉(zhuǎn)時,可使用EventBus進行跨進程通信實現(xiàn),然后拿到BottomNavigationView實例進行切換即可,此id為需要跳轉(zhuǎn)的Fragment 頁面ID

 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void OnEvent(ChangeFragBean bean) {
        binding.navView.setSelectedItemId(R.id.navigation_dashboard);
    }

Activity跳轉(zhuǎn)到Fragment

同樣使用EventBus,從一個Activity跳轉(zhuǎn)到BottomNavigationView的某個Fragment時,需要加一個延遲執(zhí)行,因為Activity可能未銷毀,延遲時間,根據(jù)具體手機性能決定,大致在300-500毫秒即可

 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
    public void OnEvent(MermberBean bean) {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                /**
                 *要執(zhí)行的操作
                 */
                binding.navView.setSelectedItemId(R.id.navigation_member);
            }
        }, 250);//3秒后執(zhí)行Runnable中的run方法
    }

到此這篇關(guān)于Android BottomNavigationView與Fragment重建與重疊問題解決方法探索的文章就介紹到這了,更多相關(guān)Android BottomNavigationView與Fragment內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論