93 votes

Fragments onResume à partir de l'arrière de la pile

Je suis en utilisant le package de compatibilité d'utilisation de Fragments avec Android 2.2. Lors de l'utilisation de fragments, et l'ajout de transitions entre eux à la backstack, j'aimerais obtenir le même comportement de onResume d'une activité, c'est à dire, chaque fois qu'un fragment est amené à "premier plan" (visible pour l'utilisateur) après poping de la backstack, j'avais comme une sorte de rappel à être activé dans le fragment (pour effectuer certaines modifications sur un partage de l'INTERFACE utilisateur de la ressource, par exemple).

J'ai vu qu'il n'y est pas intégré dans le rappel dans le fragment de cadre. est-il une bonne pratique afin de réaliser cet objectif?

112voto

oriharel Points 3489

Pour une faute d'une meilleure solution, j'ai eu ce travail pour moi: Supposons que j'ai 1 activité (MyActivity) et quelques fragments qui remplace les uns des autres (une seule est visible à un moment donné).

Dans MyActivity, ajouter cet écouteur:

getSupportFragmentManager().addOnBackStackChangedListener(getListener());

(Comme vous pouvez le voir je suis en utilisant le package de compatibilité).

getListener mise en œuvre:

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

                if (manager != null)
                {
                    MyFragment currFrag = (MyFragment)manager.
                    findFragmentById(R.id.fragmentItem);

                    currFrag.onFragmentResume();
                }                   
            }
        };

        return result;
    }

MyFragment.onFragmentResume() sera appelée après un "Retour" est pressé. quelques bémols cependant:

  1. Il suppose que vous avez ajouté tous les les transactions à la backstack (à l'aide de FragmentTransaction.addToBackStack())
  2. Il sera activé lors de chaque pile changer (vous pouvez stocker d'autres choses dans la pile de retour, tels que l'animation), de sorte vous risquez de recevoir plusieurs appels pour le même instance de fragment.

33voto

Brotoo25 Points 109

J'ai changé la solution proposée un peu. Fonctionne mieux pour moi comme ça:

private OnBackStackChangedListener getListener() {
    OnBackStackChangedListener result = new OnBackStackChangedListener() {
        public void onBackStackChanged() {
            FragmentManager manager = getSupportFragmentManager();
            if (manager != null) {
                int backStackEntryCount = manager.getBackStackEntryCount();
                if (backStackEntryCount == 0) {
                    finish();
                }
                Fragment fragment = manager.getFragments()
                                           .get(backStackEntryCount - 1);
                fragment.onResume();
            }
        }
    };
    return result;
}

4voto

PJL Points 5865

La section suivante à des Développeurs Android décrit un mécanisme de communication de la Création de rappels d'événements à l'activité. Pour citer une ligne allant de:

Une bonne façon de le faire est de définir une interface de rappel à l'intérieur du fragment et exiger que l'activité de l'hôte à mettre en œuvre. Lorsque l'activité reçoit un rappel par le biais de l'interface, il peut partager les informations avec d'autres fragments dans la mise en page si nécessaire.

Edit: Le fragment a un onStart(...) qui est appelée lorsque le fragment est visible à l'utilisateur. De même, une onResume(...) lorsqu'il est visible et activement en cours d'exécution. Celles-ci sont liées à leur activité homologues. En bref: utiliser onResume()

0voto

iamlukeyb Points 541

C'est la bonne réponse, vous pouvez appeler onResume() en fournissant le fragment est affecté à l'activité. Alternativement, vous pouvez utiliser onAttach et onDetach

0voto

roshanPoudyal Points 1

onResume() pour le fragment fonctionne très bien...

public class listBook extends Fragment {

    private String listbook_last_subtitle;
...

    @Override
       public void onCreate(Bundle savedInstanceState) {

        String thisFragSubtitle = (String) getActivity().getActionBar().getSubtitle();
        listbook_last_subtitle = thisFragSubtitle;
       }
...

    @Override
        public void onResume(){
            super.onResume();
            getActivity().getActionBar().setSubtitle(listbook_last_subtitle);
        }
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X