Io sto usando un ViewPager insieme ad un FragmentPagerAdapter per ospitare tre diversi frammentiSostituire frammento con un altro frammento all'interno ViewPager
[Fragment1][Fragment2][Fragment3]
Quello che sto cercando di realizzare è quello di sostituire con successo Fragment1 con un intero nuovo frammento, Fragment4, se un compito specifico ha successo.
Quando uso ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
..il frammento viene sostituito in modo bello e Fragment4 è mostrato invece di Fragment1. Sebbene non riesca a scorrere fino a Fragment3 e poi a Fragment4, Fragment1 è tornato.
Poi di nuovo, se uso ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
..Fragment1 viene rimossa e quando torno Fragment4 c'è. Quindi il problema con questa soluzione è che non sono riuscito a trovare un modo per mostrare immediatamente Fragment4 come viene rimosso Fragment1, anche se ho provato:
transaction.add(fragment4);
transaction.show(fragment4);
Ed ecco come mia implementazione FragmentPagerAdapter sembra al momento, senza qualsiasi operazione di gestione:
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;
}
}
Modifica.
Quindi sembra che non fosse completamente chiaro con la mia domanda. Ho deciso di rimuovere tutti gli spaghetti che sono riuscito a creare in precedenza e ho cercato di dichiarare che li avevo lasciati fuori (vedi testo in grassetto sopra).
Comunque qui è più o meno quello che ho cercato di fare all'interno 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 questo codice ottengo nulla di fatto, ma se qualcuno vede quello che sto facendo male e vorrei sottolineare io nella giusta direzione, lo apprezzerei molto!
Penso che dovresti cambiare getItem in PagerAdapter. C'è un frammento restituito che deve essere visibile. – pawelzieba
@dziobas È esattamente dove ho cercato di fare la magia che ho descritto nella mia domanda, senza fortuna. – velu
fragment2 viene chiamato quando faccio clic su tab1, non so perché viene chiamato tab2? è un errore dell'adattatore? –