开发者

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

开发者 https://www.devze.com 2023-01-17 10:22 出处:网络 作者: FranzLiszt1847
目录简介解决方法第一步第二步第三步使用同级Fragment跳转Activity跳转到Fragment简介
目录
  • 简介
  • 解决方法
    • 第一步
    • 第二步
    • 第三步
    • 使用
  • 同级Fragment跳转
    • Activity跳转到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) 开发者_Python{
                  switch (item.getItemId()) {
               android       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_activphpity_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中的同级Frjsagment需要进行跳转时,可使用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跳转到BottomNavigandroidationView的某个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.naphpvView.setSelectedItemId(R.id.navigation_member);
                  }
              }, 250);//3秒后执行Runnable中的run方法
          }
      

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

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号