返回顶部
首页 > 资讯 > 移动开发 >AndroidBottomNavigationView与Fragment重建与重叠问题解决方法探索
  • 784
分享到

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

摘要

目录简介解决方法第一步第二步第三步使用同级Fragment跳转Activity跳转到Fragment简介 在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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: AndroidBottomNavigationView与Fragment重建与重叠问题解决方法探索

本文链接: https://lsjlt.com/news/177936.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作