J'ai plusieurs fragments à l'intérieur d'une activité. Sur un bouton, cliquez sur Je commence un nouveau fragment, en l'ajoutant à backstack. Je m'attendais naturellement à ce que la onPause()
méthode du Fragment actuel et onResume()
du nouveau Fragment soit appelée. Eh bien, cela ne se produit pas.
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 à quoi je m'attendais, c'était,
- Lorsque le bouton est cliqué, LoginFragment sera remplacé par
HomeFragment ,
onPause()
de LoginFragment etonResume()
de HomeFragment est appelé - Lorsque back est pressé, HomeFragment est sorti et LoginFragment est vu, et
onPause()
de HomeFragment etonResume()
de LoginFragment est appelé.
Ce que je reçois est,
- Lorsque le bouton est cliqué, HomeFragment remplace correctement LoginFragment , onResume () de HomeFragment est appelé, mais onPause () de LoginFragment n'est jamais appelé.
- Lorsque vous appuyez à nouveau, HomeFragment apparaît correctement pour révéler LoginFragment , onPause () de HomeFragment est appelé, mais onResume () de LoginFragment n'est jamais appelé.
Est-ce le comportement normal? Pourquoi onResume()
de LoginFragment pas appelé quand j'appuie sur le bouton de retour.
android
android-fragments
onresume
back-stack
Krishnabhadra
la source
la source
Réponses:
Les fragments
onResume()
ouonPause()
seront appelés que lorsque les activitésonResume()
ouonPause()
est appelé. Ils sont étroitement couplés auActivity
.Lisez la section Gestion du cycle de vie des fragments de cet article .
la source
onPause()
être appelé aprèsonSaveInstanceState()
plutôt qu'avant. Cela peut être reproduit si vous vers un autre enfant dans monFragmentStatePagerAdapter
(disons que vous passez de l'enfant 0 à l'enfant 2, notez-le, cela se produit parce que l'enfant 0 est détruit lorsque l'enfant 2 s'ouvre )ft2.replace()
, laFragmentTransaction.remove()
méthode est appelée etLoginfragment
sera supprimée. Référez-vous à ceci . Donc,onStop()
deLoginFragment
sera appelé à la place deonPause()
. (Comme le nouveau fragment remplace complètement l'ancien).ft2.addtobackstack()
, l'état duLoginfragment
sera enregistré sous forme de bundle et lorsque vous cliquez sur le bouton de retour deHomeFragment
,onViewStateRestored()
sera appelé suivionStart()
deLoginFragment
. Donc, finalementonResume()
, ne sera pas appelé.la source
onViewStateRestored
est appelé si vous avezsetRetainInstance(true)
Voici ma version la plus robuste de la réponse de Gor (l'utilisation de fragments.size () n'est pas fiable car la taille n'est pas décrémentée après l'éclatement du fragment)
Et la méthode «getCurrentTopFragment»:
la source
Si vous voulez vraiment remplacer un fragment à l'intérieur d'un autre fragment, vous devez utiliser des fragments imbriqués .
Dans votre code, vous devez remplacer
avec
la source
mais attention si plus d'un fragment est visible
la source
ViewPager
avec des fragments fera référence à ses fragments).J'ai un code très similaire au vôtre et s'il fonctionne avec onPause () et onResume (). Lors du changement de fragment, ces fonctions sont respectivement activées.
Code en fragment:
Journal lors du changement de fragment:
Fragment onCreateView:
Action lorsque je recule (dans l'activité où je charge le fragment):
la source
Ce que je fais dans fragment enfant:
Et puis remplacer onResume sur ParentFragment
la source
Vous simple ne pouvez pas ajouter un fragment à un fragment. Cela doit se produire dans FragmentActivity. Je suppose que vous créez le LoginFragment dans une FragmentActivity, donc pour que cela fonctionne, vous devez ajouter le HomeFragment via le FragmentActivity lorsque la connexion se ferme.
Le point général est que vous avez besoin d'une classe FragmentActivity à partir de laquelle vous ajoutez chaque fragment au FragmentManager. Il n'est pas possible de le faire dans une classe Fragment.
la source
Si vous ajoutez le fragment en XML, vous ne pouvez pas les échanger dynamiquement. Ce qui se passe, c'est qu'ils sont trop, donc les événements ne se déclenchent pas comme on pourrait s'y attendre. Le problème est documenté dans cette question.FragmenManager remplace la superposition
Transformez middle_fragment en FrameLayout et chargez-le comme ci-dessous et vos événements se déclencheront.
la source
Vous pouvez essayer ça,
Étape 1: remplacer la méthode sélectionnée par tabulation dans votre activité
Étape 2: en utilisant la méthode statique, faites ce que vous voulez dans votre fragment,
la source
J'utilise dans mon activité - KOTLIN
la source
Un fragment doit toujours être intégré dans une activité et le cycle de vie du fragment est directement affecté par le cycle de vie de l'activité hôte. Par exemple, lorsque l'activité est suspendue, tous les fragments s'y trouvent, et lorsque l'activité est détruite, tous les fragments le sont également
la source
onPause()
La méthode fonctionne dans la classe d'activité que vous pouvez utiliser:dans le même but ..
la source
Suivez les étapes ci-dessous et vous obtiendrez la réponse nécessaire
1- Pour les deux fragments, créez un nouveau parent abstrait.
2- Ajoutez une méthode abstraite personnalisée qui devrait être implémentée par les deux.
3- Appelez-le depuis l'instance actuelle avant de la remplacer par la seconde.
la source
Sur la base de la réponse de @Gor, j'ai écrit similaire dans Kotlin. Placez ce code dans
onCreate()
une activité. Cela fonctionne pour un fragment visible. Si vous avezViewPager
des fragments, il appelleraViewPager
le fragment de, pas un précédent.Après avoir lu https://medium.com/@elye.project/puzzle-fragment-stack-pop-cause-issue-on-toolbar-8b947c5c07c6, j'ai compris qu'il serait préférable dans de nombreuses situations d'attacher de nouveaux fragments avec
replace
, nonadd
. Ainsi, un besoinonResume
disparaîtra dans certains cas.la source
Appel
ft.replace
doit déclencher onPause (du fragment remplacé) et onResume (du fragment de remplacement).Je remarque que votre code se gonfle
login_fragment
sur le fragment home et ne renvoie pas non plus les vues dans onCreateView. S'il s'agit de fautes de frappe, pouvez-vous montrer comment ces fragments sont appelés depuis votre activité?la source
Bien qu'avec un code différent, j'ai rencontré le même problème que l'OP, car j'ai utilisé à l'origine
au lieu de
Avec "replace" le premier fragment est recréé lorsque vous revenez du deuxième fragment et donc onResume () est également appelé.
la source
Lors de la création d'une transaction de fragment, assurez-vous d'ajouter le code suivant.
Assurez-vous également de valider la transaction après l'avoir ajoutée au backstack
la source