Android

关注公众号 jb51net

关闭
首页 > 软件编程 > Android > Android BottomNavigationView与Fragment

Android BottomNavigationView与Fragment重建与重叠问题解决方法探索

作者:FranzLiszt1847

这篇文章主要介绍了Android BottomNavigationView与Fragment重建与重叠问题解决,总的来说这并不是一道难题,那为什么要拿出这道题介绍?拿出这道题真正想要传达的是解题的思路,以及不断优化探寻最优解的过程。希望通过这道题能给你带来一种解题优化的思路

简介

在BottomNavigationView+多个Fragment框架下,进行Fragment切换时,会导致Fragment重建,也会出现同级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
        }
    }

第二步

监听BottomNavigationView切换事件

 binding.navView.setOnNavigationItemSelectedListener(listener);

对同级每一个Fragment进行监听,当进行切换的时候,对其状态进行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进行隐藏,对要跳转的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跳转

当BottomNavigationView中的同级Fragment需要进行跳转时,可使用EventBus进行跨进程通信实现,然后拿到BottomNavigationView实例进行切换即可,此id为需要跳转的Fragment 页面ID

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

Activity跳转到Fragment

同样使用EventBus,从一个Activity跳转到BottomNavigationView的某个Fragment时,需要加一个延迟执行,因为Activity可能未销毁,延迟时间,根据具体手机性能决定,大致在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() {
                /**
                 *要执行的操作
                 */
                binding.navView.setSelectedItemId(R.id.navigation_member);
            }
        }, 250);//3秒后执行Runnable中的run方法
    }

到此这篇关于Android BottomNavigationView与Fragment重建与重叠问题解决方法探索的文章就介绍到这了,更多相关Android BottomNavigationView与Fragment内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文