web-dev-qa-db-fra.com

Le fragment onResume () du fragment n'est pas appelé lorsqu'il est sorti du backstack

Bonjour, je développe une application Android dans laquelle je me sers. J'utilise une seule variable Activity et 3 fragments. Donc considérez que j'ai 3 fragments A B C. Lorsque je passe de A à B, j'ajoute Fragment à backstack et simillar de B à C. Maintenant, lorsque je clique en arrière de C, il me montre B et similaire pour B à A.

Mais le fait est que lorsque je viens de C à B ou de B à A, il n’appelle pas onResume() ni aucune autre méthode de cycle de vie de Fragment

Ce que je veux réellement faire pour chaque Fragment J'ai un titre différent dans ActionBar. Ainsi, dans mon code, lorsque je passe de A à B ou de B à c, je change le titre de l'activité à l'intérieur du fragment. Mais quand je clique sur le dos, il ne change pas en fonction de cela.

Quel est le problème actuel? Pourquoi, après avoir sauté du backstack, il n'appelle pas onResume() pour ma Fragment? Comment résoudre ce problème? Besoin d'aide pour. Je vous remercie.

17
nilkash

onResume() de la Fragment est appelée uniquement lorsque la Activity est reprise. Donc, cela ne vous aidera pas. Même je suis confronté à un problème similaire en ce moment. Vous pouvez implémenter OnBackStackChangedListener et obtenir le nom du fragment en haut de la pile et définir le titre ActionBar en fonction.

private FragmentManager.OnBackStackChangedListener getListener()
{
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener()
    {
        public void onBackStackChanged()
        {
            FragmentManager manager = getFragmentManager();

            if (manager != null)
            {
                if(manager.getBackStackEntryCount() >= 1){
                    String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName();
                    Log.i("TOP ON BACK STACK",topOnStack);
                }
                }
            }
    };

    return result;
}
18
Uma

Essayez d'utiliser la méthode replace à la place de add sur la FragmentTransaction. Ce travail pour moi:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
13
PedroDuran

Comme d’autres l’ont déjà dit, onResume() n’est appelé que lorsque l’activité elle-même reprend, ce qui n’aide en rien.

Vous devez vérifier si vous ajoutez un nouveau fragment ou remplacez un fragment existant dans votre transaction de fragment:

  • Si vous replace() un fragment précédent, celui-ci sera recréé à partir de zéro lorsque vous y reviendrez, donc onCreateView() sera appelé à nouveau et vous pourrez y mettre à jour le titre de la barre d'outils. Vous le faites probablement déjà.

  • Si vous add() un nouveau fragment, le fragment précédent est toujours là, mais pas visible. Lorsque vous y revenez, c'est à vous d'obtenir la dernière entrée de la pile arrière (utilisez getBackStackEntryCount() et getBackStackEntryAt() dans le gestionnaire de fragments), obtenez l'objet Fragment correspondant (utilisez findFragmentByTag() dans le gestionnaire de fragments), transformez ce fragment en classe de base dont tous vos fragments hériteront et appellent une méthode personnalisée, par exemple onVisible(), sur ce fragment. L'implémentation par défaut de onVisible() dans votre classe de base ne fait rien. Remplacez dans chaque fragment pour mettre à jour le titre de la barre d’outils, FAB, et n’importe quoi d’autre si nécessaire. J'appelle également onVisible() à partir de onResume() pour éviter la duplication de code.

2
Eric Sellin

Mettez ce code dans votre fragment.

@Override
public void setUserVisibleHint(boolean visible) {
        super.setUserVisibleHint(visible);
        if (visible && isResumed()) {
            onResume();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!getUserVisibleHint()) {
            return;
        }
        setData();
    }
1
Amol Suryawanshi

vous pouvez utiliser cette méthode de fragment:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}
0
Mohammad Hadi