Est-il possible d'avoir un événement lorsque la FragmentTransaction est terminée?
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment).commit();
En fait, j'utilise un tiroir pour mon application et j'aimerais déclencher invalidateOptionsMenu();
lorsque la transaction est terminée pour modifier le menu de ma barre d'actions.
Vous n'avez pas besoin d'attendre la fin de la transaction, vous pouvez appeler
getSupportFragmentManager().executePendingTransactions();
après votre appel à la fonction commit ().
Cela garantira que la transaction est terminée.
Il je! Essaye ça:
private OnBackStackChangedListener backStackListener = new OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
String name = "";
int position = getSupportFragmentManager().getBackStackEntryCount();
if(position!=0){
FragmentManager.BackStackEntry backEntry=getSupportFragmentManager().getBackStackEntryAt(position-1);
name=backEntry.getName();
}
if(position==0){
mainActionBar();
}
else if(name=="someWord"){
mainActionBar2();
}
else{
mainActionBar3();
}
}
};
getSupportFragmentManager().addOnBackStackChangedListener(backStackListener);
Et dans Transaction, ajoutez une balise à backStack comme ceci:
getSupportFragmentManager().beginTransaction()
.replace(R.id.main, SomeFragment.newInstance(some argument))
.addToBackStack("someWord").commit();
@Override
public void onResume() {
super.onResume();
getActivity().invalidateOptionsMenu();
}
Lorsque la FragmentTransaction est terminée, les méthodes du cycle de vie du fragment seront appelées, comme onResume ()
Pour info, fragment peut avoir son propre menu, Voir http://developer.Android.com/reference/Android/app/Fragment.html#setHasOptionsMenu(boolean)
Vous pouvez utiliser les conseils donnés dans cette réponse --- lance le code dont vous avez besoin une fois la transaction terminée à l'aide de la méthode onAnimationEnd
.
Pour que cela fonctionne, vous devez définir une animation sur FragmentTransaction en utilisant, par exemple,.
transaction.setCustomAnimations(R.anim.slide_in_left,
R.anim.slide_out_right);
que diriez-vous de cette méthode:
FragmentManager fm = ...;
fm.beginTransaction().add(xxx, FRAGMENT_TAG).commit();
handler.obtainMessage(FRAGMENT_COMMIT_FINISHED).sendToTarget();
lorsque la commit () est terminée, vous pouvez obtenir l'événement de FRAGMENT_COMMIT_FINISHED
Vous pouvez envisager d'utiliser commitNow () au lieu de commit () et vous pouvez alors être sûr que la transaction est terminée . Bien sûr, le problème dépend de la complexité de la transaction si vous devez le faire ou non.