Disons que j'ai une activité à laquelle des fragments ont été ajoutés par programme:
private void animateToFragment(Fragment newFragment, String tag) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, newFragment, tag);
ft.addToBackStack(null);
ft.commit();
}
Quel est le meilleur moyen de revenir au fragment précédent qui était visible?
J'ai trouvé fonctionnalité du bouton arrière du déclencheur sur le clic du bouton dans Android mais je pense que simuler un événement de touche arrière n'est pas la bonne façon de s'y prendre (et je ne peux pas le faire fonctionner non plus ):
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
L'appel de finish()
ferme simplement l'activité qui ne m'intéresse pas.
Y a-t-il une meilleure façon de s'y prendre?
Regardez les méthodes getFragmentManager().popBackStack()
(vous pouvez en choisir plusieurs)
http://developer.Android.com/reference/Android/app/FragmentManager.html#popBackStack ()
Pour élaborer sur les autres réponses fournies, voici ma solution (placée dans une activité):
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
Quand nous mettons à jour/ajoutons les fragments,
Devrait inclure la .addToBackStack()
.
getSupportFragmentManager().beginTransaction()
.add(detailFragment, "detail") // Add this transaction to the back stack (name is an optional name for this back stack state, or null).
.addToBackStack(null)
.commit();
Après cela, si nous donnons la getFragments.popBackStackImmediate()
retournera la valeur true si nous ajoutons/mettons à jour les fragments et si nous retournons à l'écran actuel.
Ajoutez ces lignes à votre méthode onBackPressed (). La méthode popBackStackImmediate () vous ramènera au fragment précédent si vous en avez un sur la pile
if(getFragmentManager().getBackStackEntryCount() > 0){
getFragmentManager().popBackStackImmediate();
}
else{
super.onBackPressed();
}
`
Cette solution fonctionne parfaitement pour la navigation par fragments dans la barre inférieure lorsque vous souhaitez fermer l'application lorsque vous appuyez de nouveau sur le fragment principal.
Par contre, lorsque vous ouvrez le fragment secondaire (fragment en fragment) qui est défini comme "DetailedPizza" dans mon code, il retournera l'état précédent du fragment primaire. À votre santé !
Les activités intérieures au dos pressées mettent ceci:
Fragment home = getSupportFragmentManager().findFragmentByTag("DetailedPizza");
if (home instanceof FragmentDetailedPizza && home.isVisible()) {
if (getFragmentManager().getBackStackEntryCount() != 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
} else {
//Primary fragment
moveTaskToBack(true);
}
Et lancez l'autre fragment comme ceci:
Fragment someFragment = new FragmentDetailedPizza();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container_body, someFragment, "DetailedPizza");
transaction.addToBackStack("DetailedPizza");
transaction.commit();
Revenez par programme au fragment précédent en utilisant le code suivant.
if ( getFragmentManager().getBackStackEntryCount() > 0)
{
getFragmentManager().popBackStack();
return;
}
super.onBackPressed();
Pour que ce fragment revienne, ajoutez simplement ce fragment dans le backstack sur lequel vous souhaitez revenir, par exemple:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = new LoginFragment();
//replacing the fragment
if (fragment != null) {
FragmentTransaction ft = ((FragmentActivity)getContext()).getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment);
ft.addToBackStack("SignupFragment");
ft.commit();
}
}
});
Dans le cas ci-dessus, j'ouvre LoginFragment
lorsque l'on appuie sur Button button
, l'utilisateur est maintenant dans SignupFragment
. Donc, si addToBackStack(TAG)
est appelé, où TAG = "SignupFragment"
, puis lorsque le bouton de retour est enfoncé dans LoginFragment
, nous revenons à SignUpFragment
.
Bon codage!
Essayez ci-dessous le code:
@Override
public void onBackPressed() {
Fragment myFragment = getSupportFragmentManager().findFragmentById(R.id.container);
if (myFragment != null && myFragment instanceof StepOneFragment) {
finish();
} else {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
En ajoutant fragment_tran.addToBackStack(null)
sur le dernier fragment, je peux revenir sur le dernier fragment.
ajout d'un nouveau fragment:
view.findViewById(R.id.changepass).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new ChangePassword());
transaction.addToBackStack(null);
transaction.commit();
}
});