La meilleure approche consiste à utiliser la méthode onBackStackChanged() de l'interface OnBackStackChangedListener fournie par Android.
Disons que nous avons un tiroir de navigation avec 4 options vers lesquelles l'utilisateur peut naviguer. Dans ce cas, nous aurons 4 fragments. Voyons d'abord le code et ensuite j'expliquerai le fonctionnement.
private int mPreviousBackStackCount = 0;
private String[] title_name = {"Frag1","Frag2","Frag3","Frag4"};
Stack<String> mFragPositionTitleDisplayed;
public class MainActivity extends ActionBarActivity implements FragmentManager.OnBackStackChangedListener
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
....
....
getSupportFragmentManager().addOnBackStackChangedListener(this);
mFragPositionTitleDisplayed = new Stack<>();
}
public void displayFragment() {
Fragment fragment = null;
String title = getResources().getString(R.string.app_name);
switch (position) {
case 0:
fragment = new Fragment1();
title = title_name[position];
break;
case 1:
fragment = new Fragment2();
title = title_name[position];
break;
case 2:
fragment = new Fragment3();
title = title_name[position];
break;
case 3:
fragment = new Fragment4();
title = title_name[position];
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.container_body, fragment)
.addToBackStack(null)
.commit();
getSupportActionBar().setTitle(title);
}
}
@Override
public void onBackStackChanged() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
if(mPreviousBackStackCount >= backStackEntryCount) {
mFragPositionTitleDisplayed.pop();
if (backStackEntryCount == 0)
getSupportActionBar().setTitle(R.string.app_name);
else if (backStackEntryCount > 0) {
getSupportActionBar().setTitle(mFragPositionTitleDisplayed.peek());
}
mPreviousBackStackCount--;
}
else{
mFragPositionTitleDisplayed.push(title_name[position]);
mPreviousBackStackCount++;
}
}
Dans le code présenté, nous avons la méthode displayFragment(). Ici, j'affiche le fragment sur la base de l'option choisie dans le tiroir de navigation. La variable position correspond à la position de l'élément cliqué dans la ListView ou la RecyclerView dans le tiroir de navigation. Je définis le titre de la barre d'action en conséquence avec getSupportActionBar.setTitle(title), où le titre enregistre le nom du titre approprié.
Chaque fois que l'on clique sur un élément du tiroir de navigation, un fragment est affiché en fonction de l'élément cliqué par l'utilisateur. Mais du côté du back-end, ce fragment est ajouté à la pile arrière et la méthode onBackStachChanged() est activée. Ce que j'ai fait, c'est que j'ai créé une variable mPreviousBackStackCount et l'ai initialisée à 0. J'ai également créé une pile supplémentaire qui stockera les noms des titres des barres d'action. Chaque fois que j'ajoute un nouveau fragment à la pile arrière, j'ajoute le nom du titre correspondant à la pile créée. De l'autre côté, chaque fois que j'appuie sur le bouton "back", onBackStackChanged() est appelé et je sors le dernier nom de titre de ma pile et je fixe le titre au nom dérivé par la méthode peek() de la pile.
Exemple :
Disons que notre backstack Android est vide :
Appuyez sur le choix 1 du tiroir nav : onBackStachChanged() est appelé et le Fragment 1 est ajouté à la pile arrière d'Android, backStackEntryCount est fixé à 1 et le Frag1 est poussé vers ma pile et la taille de mFragPositionTitleDisplayed devient 1.
Appuyez sur le choix 2 du tiroir nav : onBackStachChanged() est appelé et le Fragment 2 est ajouté à la pile arrière d'Android, backStackEntryCount est fixé à 2 et le Frag2 est poussé vers ma pile et la taille de mFragPositionTitleDisplayed devient 2.
Maintenant nous avons 2 éléments à la fois dans la pile Android et dans ma pile. Lorsque vous appuyez sur le bouton retour onBackStackChanged() est appelé et la valeur de backStackEntryCount est de 1. Le code entre dans la partie if et sort la dernière entrée de ma pile. Ainsi, la pile arrière d'Android ne contient qu'un seul fragment - "Fragment 1" et ma pile ne contient qu'un seul titre - "Frag1". Maintenant, j'ai juste à regarder() le titre de ma pile et à définir la barre d'action sur ce titre.
Rappelez-vous : Pour définir le titre du batteur d'action, utilisez peek() et non pop(), sinon votre application se plantera si vous ouvrez plus de 2 fragments et essayez de revenir en arrière en appuyant sur le bouton retour.