Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace fragment with another fragment inside ViewPager

Tags:

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!

like image 358
velu Avatar asked Sep 16 '11 13:09

velu


People also ask

How do I move from one fragment to another in ViewPager?

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 .

How to replace fragment to fragment in Android?

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

Can I use ViewPager with views not with fragments?

yes...you can use View instead of Fragment in viewpager.


1 Answers

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.

like image 53
Ridwan Yusuf Avatar answered Oct 09 '22 01:10

Ridwan Yusuf