Cuando se utiliza el cajón de navegación, los desarrolladores de Android recomiendan que en la barra de acciones "solo las pantallas que se representan en el cajón de navegación deberían tener la imagen del cajón de navegación" y que "todas las demás pantallas tengan el quilate tradicional".
Ver aquí para más detalles: http://youtu.be/F5COhlbpIbY
Estoy usando una actividad para controlar múltiples niveles de fragmentos y puedo hacer que la imagen del cajón de navegación se muestre y funcione en todos los niveles.
Al crear fragmentos de nivel inferior, puedo llamar ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
para ocultar la imagen del cajón de navegación y mostrar el cursor hacia arriba
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
El problema que tengo es que cuando vuelvo a los fragmentos de nivel superior, el quilate de arriba todavía se muestra en lugar de la imagen original del cajón de navegación. ¿Alguna sugerencia sobre cómo "actualizar" la barra de acciones en los fragmentos de nivel superior para volver a mostrar la imagen del cajón de navegación?
Solución
La sugerencia de Tom funcionó para mí. Esto es lo que hice:
Actividad principal
Esta actividad controla todos los fragmentos de la aplicación.
Al preparar nuevos fragmentos para reemplazar a otros, configuro el DrawerToggle de setDrawerIndicatorEnabled(false)
esta manera:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
A continuación, en una anulación de onBackPressed
, revertí lo anterior estableciendo el DrawerToggle para que setDrawerIndicatorEnabled(true)
así:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
En los fragmentos de nivel inferior
En los fragmentos que modifiqué onCreate
y onOptionsItemSelected
así:
En onCreate
agregado setHasOptionsMenu(true)
para habilitar la configuración del menú de opciones. También se configura setDisplayHomeAsUpEnabled(true)
para habilitar < en la barra de acciones:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
Luego, onOptionsItemSelected
cada vez que se presiona <, se llama onBackPressed()
desde la actividad para subir un nivel en la jerarquía y mostrar la imagen del cajón de navegación:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
.replace(R.id.frag_layout
. Si este es un nivel jerárquico más, esperaría que .add
lo volviera a apilar.
theDrawerToggle.setDrawerIndicatorEnabled(false);
interior del fragmento? Creo que se declara en el archivo de clase de actividad principal. No puedo encontrar una manera de hacer referencia a esto. ¿Alguna pista?
setDisplayOptions()
método dentro del ToolbarWidgetWrapper
(del paquete interno android.support.v7.internal.widget) no volvería a crear el icono al ingresar el mismo fragmento por segunda vez. Solo dejo esto aquí para cuando otros tropiecen con este problema también.