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

Android BottomNavigationView與Fragment重建與重疊問(wèn)題解決方法探索

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

簡(jiǎn)介

在BottomNavigationView+多個(gè)Fragment框架下,進(jìn)行Fragment切換時(shí),會(huì)導(dǎo)致Fragment重建,也會(huì)出現(xiàn)同級(jí)Fragment未hide,導(dǎo)致重疊

解決方法

第一步

初始化一個(gè)默認(rèn)需要顯示的Fragment頁(yè)面

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)聽(tīng)BottomNavigationView切換事件

 binding.navView.setOnNavigationItemSelectedListener(listener);

對(duì)同級(jí)每一個(gè)Fragment進(jìn)行監(jiān)聽(tīng),當(dāng)進(jìn)行切換的時(shí)候,對(duì)其狀態(tài)進(jìn)行show或者h(yuǎn)ide

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;
        }
    };

第三步

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

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);

同級(jí)Fragment跳轉(zhuǎn)

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

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

Activity跳轉(zhuǎn)到Fragment

同樣使用EventBus,從一個(gè)Activity跳轉(zhuǎn)到BottomNavigationView的某個(gè)Fragment時(shí),需要加一個(gè)延遲執(zhí)行,因?yàn)锳ctivity可能未銷(xiāo)毀,延遲時(shí)間,根據(jù)具體手機(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重建與重疊問(wèn)題解決方法探索的文章就介紹到這了,更多相關(guān)Android BottomNavigationView與Fragment內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論