J'ai utilisé une combinaison de Roger Garzon Nieto y de sohailaziz réponses. Mon application a une seule MainActivity, et des fragments A, B, C qui sont chargés dans celle-ci. Mon fragment "home" (A) implémente OnBackStackChangedListener, et vérifie la taille du backStack ; si elle est inférieure à un, alors il cache le bouton UP. Les fragments B et C chargent toujours le bouton arrière (dans ma conception, B est lancé depuis A, et C est lancé depuis B). L'activité principale elle-même ouvre simplement la pile arrière lorsque le bouton UP est touché, et possède des méthodes pour afficher/masquer le bouton, que les fragments appellent :
Activité principale :
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
getSupportFragmentManager().popBackStack();
return true;
}
return super.onOptionsItemSelected(item);
}
public void showUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
public void hideUpButton() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); }
fragmentA (implémente FragmentManager.OnBackStackChangedListener) :
public void onCreate(Bundle savedinstanceSate) {
// listen to backstack changes
getActivity().getSupportFragmentManager().addOnBackStackChangedListener(this);
// other fragment init stuff
...
}
public void onBackStackChanged() {
// enable Up button only if there are entries on the backstack
if(getActivity().getSupportFragmentManager().getBackStackEntryCount() < 1) {
((MainActivity)getActivity()).hideUpButton();
}
}
fragmentB, fragmentC :
public void onCreate(Bundle savedinstanceSate) {
// show the UP button
((MainActivity)getActivity()).showUpButton();
// other fragment init stuff
...
}