【问题标题】:Replacing Fragment in a Tablayout替换 Tablayout 中的片段
【发布时间】:2016-09-30 13:13:27
【问题描述】:

我正在尝试用新的Fragment 替换我的Tablayout 中的片段,但是我看到的所有地方都在使用:

                Fragment newFragment = new UserProfileFragment();
                FragmentTransaction transaction = getFragmentManager().beginTransaction();

                transaction.replace(R.id.fragment_container, newFragment);
                transaction.addToBackStack(null);

                transaction.commit();

但是,由于我使用的是 tablayoutviewpager,所以我没有像 R.id.fragment_container 这样的东西。下面是我的活动,也附上了片段。

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_user_home);


        userHomeToolbar = (Toolbar) findViewById(R.id.userHomeTabView);
        setSupportActionBar(userHomeToolbar);

        viewPager = (ViewPager) findViewById(R.id.viewpager);
        setupViewPager(viewPager);

        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

    }

    private void setupViewPager(ViewPager viewPager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(new UserProfileFragment(), "Home");
        adapter.addFragment(new FootballGroundFragment(), "Grounds");
        adapter.addFragment(new UserSettingsFragment(), "Friends");

        viewPager.setAdapter(adapter);
    }

    public void onFragmentInteraction(Uri uri){
        //you can leave it empty
    }

    class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<String> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, String title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position);
        }
    }

【问题讨论】:

  • 然后在您想要更改片段的片段中,在该布局中创建一个容器并在其中膨胀两个片段
  • 我该怎么做呢?
  • 你可以看到抽屉导航作为容器的参考
  • 对不起,我不明白你的意思。
  • 我已经添加了一个示例作为答案。尝试一次,它可能会有所帮助

标签: android android-fragments


【解决方案1】:

您的情况是在viewpager中替换一个片段,已经有很多好的解决方案,检查:

1) Replace Fragment inside a ViewPager

Replace one Fragment with another in ViewPager

Replace current Fragment in ViewPager on Android

2) 这是一个很好的教程: http://www.pineappslab.com/post/fragments-viewpager/

【讨论】:

    【解决方案2】:

    你可以在fragment中创建一个容器来拥有多个fragment。为此,您可以在 xml 中使用 fragment tagFrame Layout

    有些像这样。

    <FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
    

    并且在您的片段中,您可以使用片段事务对它们进行膨胀。请注意,在您的片段中,您必须使用 childFragmentManager

    例如

    FragmentManager childFragMan = getChildFragmentManager();
    FragmentTransaction childFragTrans = childFragMan.beginTransaction();
    ChildFragment fragB = new ChildFragment ();
    childFragTrans.add(R.id.FRAGMENT_PLACEHOLDER, fragB);
    childFragTrans.addToBackStack("B");
    childFragTrans.commit(); 
    

    【讨论】:

      【解决方案3】:

      默认情况下,当没有与给定位置关联的片段时,FragmentPagerAdapter 会调用 getItem() 方法。因此,当您更改该位置的片段时,它不会更新。因此,一种可能的解决方案是从片段管理器中显式删除该位置的旧片段,以便下次为该位置添加新片段。

      可以这样做:

      覆盖 ViewPagerAdapter 类中的 instantiateItem() 方法。

          @Override
          public Object instantiateItem(@NonNull ViewGroup container, int position) {
              Fragment currentFragment = (Fragment) super.instantiateItem(container, position);
              Fragment actualFragment = getItem(position);
      
              if (actualFragment != currentFragment) {
                  // Remove the old fragment
                  FragmentTransaction transaction = fragmentManager.beginTransaction();
                  transaction.remove(currentFragment);
                  transaction.commitNow();
      
                  // The super class method takes care of adding the new fragment
                  currentFragment = (Fragment) super.instantiateItem(container, position);
              }
      
              return currentFragment;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-21
        • 2021-05-08
        • 1970-01-01
        • 2012-04-21
        • 2016-05-05
        • 1970-01-01
        相关资源
        最近更新 更多