【问题标题】:What is the best way to add fragment in the Tabs android在 Tabs android 中添加片段的最佳方法是什么
【发布时间】:2017-08-07 07:41:05
【问题描述】:

我的应用程序有一个底部导航栏,它有 5 个选项卡。 所以根据这些标签,我有 5 个片段 当我单击选项卡时,片段会根据该选项卡进行更改。 我可以使用 beginTransaction().replace 方法切换片段... 我不希望每次切换标签时都破坏并重新创建片段,所以我的解决方案是这样的

//I init 5 fragments
Fragment1 frag1 = new Fragment1();
Fragment2 frag2 = new Fragment2();
Fragment3 frag3 = new Fragment3();
Fragment4 frag4 = new Fragment4();
Fragment5 frag5 = new Fragment5();

//When I click on tab, for example tab1, I hide all fragments except tab1
//hide all fragments
getSupportFragmentManager()
                    .beginTransaction()
                    .hide(fragment1) //Fragment2, 3, 4, 5 as well
                    .commit();

//show fragment 1
getSupportFragmentManager()
                    .beginTransaction()
                    .show(fragment1)
                    .commit();

效果很好,但问题是有时会同时显示 2 个片段(我不知道为什么,因为我隐藏了所有片段) 还有其他方法可以实现吗?切换片段而不破坏它并重新创建它。

【问题讨论】:

    标签: java android android-fragments


    【解决方案1】:

    为了添加片段,我为我的项目制作了这段代码,希望对您有所帮助。

     public static void replaceFragment(Fragment fragment, FragmentManager fragmentManager) {
            String backStateName = fragment.getClass().getName();
            String fragmentTag = backStateName;
    
    
            Fragment currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
            Log.e("Current Fragment", "" + currentFrag);
    
    //        boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
            int countFrag = fragmentManager.getBackStackEntryCount();
            Log.e("Count", "" + countFrag);
    
    
            if (currentFrag != null && currentFrag.getClass().getName().equalsIgnoreCase(fragment.getClass().getName())) {
                return;
            }
    
    
            FragmentTransaction ft = fragmentManager.beginTransaction();
    //        if (!fragmentPopped) {
    
            ft.replace(R.id.frame_container, fragment);
            ft.addToBackStack(backStateName);
            ft.commit();
    //        }
    
            currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
            Log.e("Current Fragment", "" + currentFrag);
    
    
        }
    

    希望对您有所帮助,并在整个项目中使用此方法替换片段。

    【讨论】:

      【解决方案2】:

      在这种情况下,使用 ViewPagerFragmentPagerAdapter 适合您。

      然后使用ViewPager#setOffsetPageLimit(5)。这将帮助您显示/隐藏您的片段,而无需重新创建它。

      关注tutorial

      试试看,然后告诉我你的问题是否解决了。 ;)

      【讨论】:

      • 它被称为:setOffscreenPageLimit()
      • 切换标签时延迟太多。并且片段不断重新创建(即使我使用了 SmartFragmentStatePagerAdapter)
      • SmartFragmentStatePagerAdapter 和 FragmentStatePagerAdapter 在您有很多 Fragment 时非常有用(例如阅读器应用程序)。使用 FragmentPagerAdapter 就足够了。请上传你的代码,让我看看
      • 它有效,我忘了添加 setOffscreenPageLimit。非常感谢。我是android的初学者,你如何学习android。您向我推荐的任何课程、页面或书籍
      • Udacity、codepath、stackoveflow 文档都是很好的资源。
      【解决方案3】:

      您不必隐藏片段,只需像这种方法一样替换片段即可:

      public void setFragment(Fragment fragmentWhichYouWantToShow) {
      
              fm = getSupportFragmentManager();
              ft = fm.beginTransaction();
              ft.replace(R.id.container, fragmentWhichYouWantToShow);
              ft.commit();
      

      }

      【讨论】:

      • 我知道拒绝投票的原因吗?
      • 我不知道你的问题的答案,赞成。区别在于生命周期。当您将片段 A 替换为 B 时,A 的视图将被破坏。但是当你隐藏片段A并显示B时,A的视图并没有被破坏。
      • 是的,视图没有被破坏,因为我们只是“隐藏”了它。因为活动没有发生任何事情
      【解决方案4】:

      尝试在单一交易中进行。

      protected void showAsRootFragment(Fragment fragment, @NonNull String tag) {
          FragmentManager supportFragmentManager = getSupportFragmentManager();        
          FragmentTransaction transaction = supportFragmentManager.beginTransaction();
          if (supportFragmentManager.getFragments() != null) {
              for (Fragment attachedFragment : supportFragmentManager.getFragments()) {
                  if (attachedFragment != null && !tag.equals(attachedFragment.getTag())) {
                      transaction.hide(attachedFragment);
                      attachedFragment.setUserVisibleHint(false);
                  }
              }
          }
      
          if (!fragment.isAdded()) {
              transaction.add(R.id.frame_container, fragment, tag);
              fragment.setUserVisibleHint(true);
          } else {
              transaction.show(fragment);
              fragment.setUserVisibleHint(true);
          }
      
          transaction.commit();
      }    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-04
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多