231 votes

Fragment onResume() & onPause() n'est pas appelée sur la backstack

Eh bien, je suis en train de créer avec les fragments. Donc, cette question est peut-être un peu enfantin..

J'ai plusieurs fragment à l'intérieur d'une activité. Sur un clic de bouton, je suis en train de créer un nouveau fragment, de l'ajouter à la backstack. Je m'attendais bien sûr à l' onPause() méthode de courant Fragment onResume() de nouveau Fragment d'être appelé. Eh bien, il n'est pas le cas.

LoginFragment.java

public class LoginFragment extends Fragment{
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      final View view  =   inflater.inflate(R.layout.login_fragment, container, false);
      final FragmentManager mFragmentmanager =  getFragmentManager();

      Button btnHome  = (Button)view.findViewById(R.id.home_btn);
      btnHome.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view){
           HomeFragment fragment    = new HomeFragment();
           FragmentTransaction ft2   =  mFragmentmanager.beginTransaction();
           ft2.setCustomAnimations(R.anim.slide_right, R.anim.slide_out_left
                    , R.anim.slide_left, R.anim.slide_out_right);
           ft2.replace(R.id.middle_fragment, fragment);
           ft2.addToBackStack(""); 
           ft2.commit();    
         }
      });
  }

  @Override
  public void onResume() {
     Log.e("DEBUG", "onResume of LoginFragment");
     super.onResume();
  }

  @Override
  public void onPause() {
    Log.e("DEBUG", "OnPause of loginFragment");
    super.onPause();
  }
}

HomeFragment.java

public class HomeFragment extends Fragment{
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     final View view  =   inflater.inflate(R.layout.login_fragment, container, false);
  }

  @Override
  public void onResume() {
     Log.e("DEBUG", "onResume of HomeFragment");
     super.onResume();
  }

  @Override
  public void onPause() {
     Log.e("DEBUG", "OnPause of HomeFragment");
     super.onPause();
  }
}

Ce que j'ai attendu, a été,

  1. Lorsque le bouton est cliqué, LoginFragment sera remplacé par HomeFragment, onPause() de LoginFragment, et onResume()de HomeFragment est appelée
  2. Lorsque le dos est appuyé, HomeFragment est poped et LoginFragmentest vu, et onPause() de HomeFragment et onResume() de LoginFragment est appelée.

Ce que je reçois est,

  1. Lorsque le bouton est cliqué, HomeFragment est correctement remplacement LoginFragment, onResume() de HomeFragment est appelé, mais onPause() de LoginFragment n'est jamais appelée.
  2. Une fois de retour pressé, HomeFragment est correctement popping pour révéler LoginFragment, onPause() de HomeFragment est appelée, mais onResume() de LoginFragment n'est jamais appelé.

Est-ce le comportement normal? Pourquoi est - onResume() de LoginFragment pas appelé quand j'appuie sur le bouton retour.

209voto

Sagar Waghmare Points 2150

Les fragments onResume() ou onPause() sera appelé uniquement lorsque les Activités de l' onResume() ou onPause() est appelé. Ils sont étroitement associés à l' Activity.

Lire la Manipulation du Fragment du Cycle de vie de cet article.

23voto

Gopal Points 29
  • Comme vous avez utilisé ft2.replace(), FragmentTransaction.remove() la méthode est appelée et l' Loginfragment sera supprimé. Reportez-vous à cela. Donc, onStop() de LoginFragment sera appelée à la place de onPause(). (Comme le nouveau fragment remplace complètement l'ancien).
  • Mais puisque vous avez également utilisé ft2.addtobackstack(), l'état de l' Loginfragment sera enregistré comme un paquet et lorsque vous cliquez sur le bouton retour de HomeFragment, onViewStateRestored() sera appelée, suivi par onStart()de LoginFragment. Donc finalement, onResume() ne sera pas appelé.

13voto

Bersh Points 1159

Si vous voulez vraiment remplacer le fragment à l'intérieur d'autres fragment que vous devez utiliser Imbriquée Fragments.

Dans votre code, vous devriez remplacer

final FragmentManager mFragmentmanager =  getFragmentManager();

avec

final FragmentManager mFragmentmanager =  getChildFragmentManager();

0voto

Nickolaus Points 1362

Vous simple ne pouvez pas ajouter un fragment d'un fragment. Ce qui doit arriver dans la FragmentActivity. Je suppose que vous êtes la création de la LoginFragment dans un FragmentActivity, afin de le faire fonctionner, vous devez ajouter les HomeFragment via le FragmentActivity lorsque la connexion se ferme.

L'idée générale est que vous avez besoin d'un FragmentActivity classe à partir de l'endroit où vous ajoutez chaque Fragment à l'FragmentManager. Il n'est pas possible de faire cela à l'intérieur d'un Fragment de la classe.

0voto

Nepster Points 893

Un fragment doit toujours être incorporé dans une activité et le fragment du cycle de vie est directement affectée par l'activité de l'hôte du cycle de vie. Par exemple, lorsque l'activité est suspendue, ce sont donc tous les fragments, et lorsque l'activité est détruite, ce sont donc tous les fragments

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