I'm using a ViewPager together with a FragmentPagerAdapter to host three different fragments
[Fragment1][Fragment2][Fragment3]
What I'm trying to achieve is to successfully replace Fragment1 with a whole new fragment, Fragment4, if a specific task succeeds.
When I use..
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.fragment1_layout_id, fragment4); transaction.commit();
..the fragment is replaced beautifully and Fragment4 is shown instead of Fragment1. Though as soon as I swipe all the way to Fragment3 and then back to Fragment4, Fragment1 has made a comeback.
Then again, if I use..
FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.remove(fragment1); transaction.commit();
..Fragment1 is removed and when I come back Fragment4 is there. So the problem with this solution is that I couldn't find a way to immediately show Fragment4 as Fragment1 is removed, even if I tried:
transaction.add(fragment4); transaction.show(fragment4);
And here's how my FragmentPagerAdapter implementation looks like at the moment, without any transaction managing:
public static class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return VIEW_COUNT; } @Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case 0: fragment = Fragment1.newInstance(context_); break; case 1: fragment = Fragment2.newInstance(context_); break; case 2: fragment = Fragment3.newInstance(context_); break; default: break; } return fragment; } }
Edit.
So it seems like I wasn't totally clear with my question. I decided to remove all the spaghetti I managed to create earlier and tried to state that I had left them off (see bolded text above).
Anyway here's pretty much what I have been trying to do inside getItem():
@Override public Fragment getItem(int position) { Fragment fragment = null; switch (position) { case 0: if (!app.isUserLoggedIn) { if (loginFragment_ == null) { loginFragment_ = LoginFragment.newInstance(context_); transaction_ = fragmentManager_.beginTransaction(); if (logoutFragment_ != null) { transaction_.remove(logoutFragment_); logoutFragment_ = null; } transaction_.add(loginFragment_, "login"); transaction_.commit(); } if (fragmentManager_.findFragmentByTag("login") == null) fragment = LoginFragment.newInstance(context_); else fragment = fragmentManager_.findFragmentByTag("login"); } else { if (logoutFragment_ == null) { logoutFragment_ = LogoutFragment.newInstance(context_); transaction_ = fragmentManager_.beginTransaction(); if (loginFragment_ != null) { transaction_.remove(loginFragment_); loginFragment_ = null; } transaction_.add(logoutFragment_, "logout"); transaction_.commit(); } if (fragmentManager_.findFragmentByTag("logout") == null) fragment = LogoutFragment.newInstance(context_); else fragment = fragmentManager_.findFragmentByTag("logout"); } break; case 1: fragment = HomeFragment.newInstance(context_); break; case 2: fragment = RegisterFragment.newInstance(context_); break; default: break; } return fragment; }
With this code I get nothing done, but if someone sees what I'm doing wrong and would like to point me in the correct direction, I'd appreciate it a lot!
It replaces Fragment in first page of ViewPager with another one, and if you return back from second Fragment , first Fragment is correctly displayed. Doesn't matter Fragment displayed in first page, if you swipe from one page to another, it doesn't change its Fragment .
Use replace() to replace an existing fragment in a container with an instance of a new fragment class that you provide. Calling replace() is equivalent to calling remove() with a fragment in a container and adding a new fragment to that same container. transaction. commit();
yes...you can use View instead of Fragment in viewpager.
Try using FragmentStatePagerAdapter
http://android-developers.blogspot.com/2011_08_01_archive.html
coz it will remove the fragment as you swipe through the view(also when you call getitem), so you don't need to explicitly remove them yourself.
I've been having the same problem it works for me.
I try your code and remove the if (fragment!=null)
block and it works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With