Usei uma combinação de Roger Garzon Nieto e Sohailaziz respostas . Meu aplicativo tem uma única MainActivity e fragmentos A, B, C que são carregados nele. Meu fragmento "inicial" (A) implementa OnBackStackChangedListener e verifica o tamanho do backStack; se for menor que um, oculta o botão PARA CIMA. Os fragmentos B e C sempre carregam o botão Voltar (em meu projeto, B é iniciado de A e C é iniciado de B). A própria MainActivity apenas exibe o backstack no toque do botão UP, e tem métodos para mostrar / ocultar o botão, que os fragmentos chamam:
Atividade principal:
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 (implementa 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
...
}