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?
InformationsquelleAutor velu | 2011-09-16