Reemplazar fragmento con otro fragmento dentro de ViewPager
Estoy usando un ViewPager junto con un FragmentPagerAdapter para alojar tres fragmentos diferentes
[Fragment1][Fragment2][Fragment3]
Lo que estoy tratando de lograr es reemplazar con éxito Fragment1 con un fragmento completamente nuevo, Fragment4, si una tarea específica tiene éxito.
Cuando uso ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
.. el fragmento se reemplaza maravillosamente y se muestra Fragment4 en lugar de Fragment1. Aunque tan pronto como deslizo hasta Fragment3 y luego de regreso a Fragment4, Fragment1 ha regresado.
Luego, de nuevo, si uso ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
.. Fragment1 se elimina y cuando regreso Fragment4 está allí. Entonces, el problema con esta solución es que no pude encontrar una manera de mostrar inmediatamente Fragment4 a medida que se elimina Fragment1, incluso si intenté:
transaction.add(fragment4);
transaction.show(fragment4);
Y así es como se ve mi implementación de FragmentPagerAdapter en este momento,sin ninguna gestión de transacciones:
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;
}
}
Editar
Así que parece que no estaba totalmente claro con mi pregunta. Decidí eliminar todos los espaguetis que logré crear antes e intenté decir que los había dejado (ver el texto en negrita arriba).
e todos modos, aquí es más o menos lo que he estado tratando de hacer dentro de 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;
}
Con este código no hago nada, pero si alguien ve lo que estoy haciendo mal y me gustaría señalarme en la dirección correcta, ¡lo agradecería mucho!