替换Tablayout中的片段

时间:2016-09-30 13:13:27

标签: android android-fragments

我正在尝试使用新的Tablayout替换Fragment中的片段,但无论我看到的是什么用途:

                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);
        }
    }

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

您可以在要包含多个片段的片段中创建容器。为此,您可以在 xml 中使用片段代码框架布局

有些像这样。

<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(); 

答案 2 :(得分:0)

默认情况下,当没有片段与给定位置关联时,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;
    }