Substitua fragmento por outro fragmento dentro do ViewPager
Estou usando um ViewPager junto com um FragmentPagerAdapter para hospedar três fragmentos diferentes
[Fragment1][Fragment2][Fragment3]
O que estou tentando obter é substituir com êxito o Fragment1 por um fragmento totalmente novo, Fragment4, se uma tarefa específica for bem-sucedid
Quando eu uso ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
.. o fragmento é substituído lindamente e o Fragment4 é mostrado em vez do Fragment1. Embora assim que eu deslize todo o caminho para o Fragment3 e depois volte para o Fragment4, o Fragment1 retorno
Então, novamente, se eu usar ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
.. Fragment1 é removido e quando eu voltar Fragment4 está lá. Portanto, o problema com esta solução é que não consegui encontrar uma maneira de mostrar imediatamente o Fragment4, pois o Fragment1 é removido, mesmo se eu tentasse:
transaction.add(fragment4);
transaction.show(fragment4);
E aqui está como minha implementação FragmentPagerAdapter se parece no momento, sem nenhuma transação gerenciando:
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
Então, parece que eu não estava totalmente claro com a minha pergunta. Decidi remover todos os espaguetes que consegui criar anteriormente e tentei afirmar que os havia deixado (veja o texto em negrito acima
e qualquer forma, aqui está o que eu tenho tentado fazer 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;
}
Com esse código, não faço nada, mas se alguém vê o que estou fazendo de errado e gostaria de me indicar a direção correta, eu apreciaria muito!