Remplacer le fragment avec un autre fragment à l'intérieur de ViewPager
Je suis en utilisant un ViewPager avec un FragmentPagerAdapter pour accueillir trois différents fragments
[Fragment1][Fragment2][Fragment3]
Ce que je suis en train de réaliser est de réussir à remplacer Fragment1 avec un tout nouveau fragment, Fragment4, si une tâche spécifique réussit.
Lorsque j'utilise..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
..le fragment est remplacé magnifiquement et Fragment4 est affiché à la place de Fragment1. Mais dès que j'ai glisser tout le chemin à Fragment3 et puis retour à Fragment4, Fragment1 a fait un retour en force.
Et puis, si j'utilise..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
..Fragment1 est supprimé et quand je reviens, Fragment4 est là. Donc, le problème avec cette solution est que je ne pouvais pas trouver un moyen de montrer immédiatement Fragment4 comme Fragment1 est retiré, même si j'ai essayé:
transaction.add(fragment4);
transaction.show(fragment4);
Et voici comment mon FragmentPagerAdapter mise en œuvre ressemble à l'instant, sans aucune opération de gestion de:
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;
}
}
Modifier.
Donc il semble que je n'étais pas totalement claire à ma question. J'ai décidé de supprimer tous les spaghetti, j'ai réussi à créer plus tôt et a essayé de l'état que je l'avais laissé au large (voir le texte en gras ci-dessus).
De toute façon, voici à peu près ce que j'ai essayé de le faire à l'intérieur 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;
}
Avec ce code, je ne reçois rien fait, mais si quelqu'un voit ce que je fais mal et aimerais me diriger dans la bonne direction, je l'apprécierais beaucoup!
- Je pense que vous devriez changer getItem dans PagerAdapter. Il y est retourné fragment qui doit être visible.
- C'est exactement là où j'ai essayé de faire de la magie que j'ai décrit dans ma question, avec pas de chance.
- fragment2 est appelée lorsque je clique sur tab1 , je ne sais pas pourquoi tab2 est appelé? est erreur de carte?
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser FragmentStatePagerAdapter
http://android-developers.blogspot.com/2011_08_01_archive.html
coz il va supprimer la fragment que vous passez à travers le point de vue(aussi lorsque vous appelez getitem), de sorte que vous n'avez pas besoin explicitement les supprimer vous-même.
J'ai eu le même problème il fonctionne pour moi.
J'ai essayer ton code et supprimer les
if (fragment!=null)
bloc et ça fonctionne.Comme Maurycy dit, vous devez appeler
mAdapter.notifyDataSetChanged()
chaque fois que vous voulez dire à la ViewPager que les fragments ont été remplacés. Cependant, vous devez également remplacer legetItemPosition()
fonction abstraite de votre carte et de retour POSITION_NONE lorsqu'il est appelé avec un vieux, pour être caché, fragment comme argument. Sinon, ViewPager conservera tous les fragments.Pour plus d'informations et d'exemples de code, voir cette réponse à un une question relative à la.
Ne devrait pas votre
getItem
de la déclaration de retour fragment4 pourcase 0
dans certaines circonstances?Hey, j'ai résolu ce problème en utilisant une Liste à l'intérieur de mon FragmentPagerAdapter pour gérer les différents fragments et puis mon getItem est comme si....
Je puis par programmation de supprimer/ajouter/réorganiser les éléments de la liste (fragments) puis d'appeler le gestionnaire
Veuillez consulter mon réponse à une question similaire sur la manière d'insérer/remplacer les tabulations avec un
ViewPager
etFragmentPagerAdapter
.Essayez de définir offScreenPageLimit à 5 (ou selon votre cas d'utilisation) pour éviter de recharger du fragment, de sorte que ce que vous aviez remplacé restera au lieu de se rechargé lorsque vous balayez.