3

I'm trying to replace a fragment in my Tablayout with a new Fragment, however everywhere i have looked uses:

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

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

                transaction.commit();

However, as i'm using tablayout and viewpager, i don't have anything like R.id.fragment_container. Below is my activity which the fragments are attached too.

    @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);
        }
    }
Burhanuddin Rashid
  • 4,736
  • 5
  • 32
  • 48
xiimoss
  • 675
  • 2
  • 9
  • 18

3 Answers3

1

Your situation is replace a fragment in a viewpager, there have been many good solutions for it, check:

1) Replace Fragment inside a ViewPager

or Replace one Fragment with another in ViewPager

or Replace current Fragment in ViewPager on Android

2) Here is a good tutorial: http://www.pineappslab.com/post/fragments-viewpager/

Community
  • 1
  • 1
super1ha1
  • 549
  • 1
  • 7
  • 15
0

You can create a container in the fragment you want to have multiple fragments. For this you can either use fragment tag or Frame Layout in your xml.

Some what like this.

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

And in your fragment you can inflate them using fragment transaction. Note that in your fragment you have to use childFragmentManager.

For example

FragmentManager childFragMan = getChildFragmentManager();
FragmentTransaction childFragTrans = childFragMan.beginTransaction();
ChildFragment fragB = new ChildFragment ();
childFragTrans.add(R.id.FRAGMENT_PLACEHOLDER, fragB);
childFragTrans.addToBackStack("B");
childFragTrans.commit(); 
Vivek Mishra
  • 5,269
  • 7
  • 41
  • 74
0

By default FragmentPagerAdapter calls the getItem() method when there is no fragment associated with the given position. Therefore when you change the fragment at that position it is not updated. So one possible solution is to remove the old fragment present at that position from the fragment manager explicitly so that next time it adds the new fragment for that position.

It can be done like this:

Override the instantiateItem() method inside your ViewPagerAdapter class.

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