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 delToolbarWidgetWrapper
(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.Respuestas:
Ha escrito que, para implementar fragmentos de nivel inferior, está reemplazando el fragmento existente, en lugar de implementar el fragmento de nivel inferior en una nueva actividad.
Creo que luego tendría que implementar la funcionalidad de respaldo manualmente: cuando el usuario presionó hacia atrás, tiene un código que muestra la pila (por ejemplo, en
Activity::onBackPressed
anulación). Entonces, donde sea que hagas eso, puedes revertir elsetDrawerIndicatorEnabled
.fuente
Es fácil como 1-2-3.
Si quieres lograr:
1) Indicador del cajón : cuando no hay fragmentos en la pila posterior o el cajón está abierto
2) Flecha : cuando algunos Fragmentos están en la Pila de Atrás
3) Ambos indicadores para actuar según su forma
PD: Consulte Crear un cajón de navegación en desarrolladores de Android para obtener otros consejos sobre el comportamiento del indicador de 3 líneas.
fuente
setActionBarArrowDependingOnFragmentsBackStack()
... qué nombre tan largo: PHe usado lo siguiente:
fuente
drawerToggle.setToolbarNavigationClickListener(
se llama a este oyente al hacer clic en la flechaSi el botón de la barra de acción arriba no funciona, no olvide agregar el oyente:
Tengo algunos problemas para implementar una navegación de cajones con un botón de inicio, todo funcionó excepto el botón de acción.
fuente
Intente manejar la selección de elementos de Inicio en MainActivity dependiendo del estado del DrawerToggle. De esta manera, no tiene que agregar el mismo código a cada fragmento.
fuente
onBackPressed()
porque quería el mismo comportamiento para ambos.SEGUIMIENTO
La solución dada por @dzeikei es clara, pero puede extenderse, cuando se usan fragmentos, para manejar automáticamente el retroceso del indicador del cajón cuando la pila está vacía.
EDITAR
Por la pregunta de @JJD.
Los fragmentos se mantienen / gestionan en una actividad. El código anterior se escribe una vez en esa actividad, pero solo maneja el código de detención
onOptionsItemSelected
.En una de mis aplicaciones, también necesitaba manejar el comportamiento del cursor hacia arriba cuando se presionaba el botón Atrás. Esto se puede manejar anulando
onBackPressed
.Tenga en cuenta la duplicación de código entre
onOptionsItemSelected
yonBackPressed
que puede evitarse creando un método y llamando a ese método en ambos lugares.También tenga en cuenta que agrego dos veces más, lo
executePendingTransactions
que en mi caso fue necesario o, de lo contrario, a veces tuve comportamientos extraños del up caret.fuente
mDrawerToggle
dentro de unaNavigationDrawerFragment
clase. Para conseguir que funcione necesito también cambiar el estado del botón de inicio / indicador - ver:NavigationDrawerFragment#toggleDrawerIndicator
. Además, no estoy seguro de que necesite el registro inicialonOptionsItemSelected
: lo descomenté. - Ejemplo simplificadoonOptionsItemSelected
. Esto garantiza que el Cajón de navegación aún se abra en la jerarquía de nivel superior. Sin embargo, moví el código alNavigationDrawerFragment#onOptionsItemSelected
. Esto me ayuda a no exponermemDrawerToggle
alMainActivity
.Creé una interfaz para la actividad de alojamiento para actualizar el estado de visualización del menú de hamburguesas. Para los fragmentos de nivel superior, configuro el conmutador
true
y para los fragmentos para los que quiero mostrar la flecha hacia arriba <establezco el conmutadorfalse
.Entonces en mi actividad ...
fuente
Esta respuesta estaba funcionando pero había un pequeño problema con ella. No
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
se llamó explícitamente y estaba causando que el ícono del cajón se ocultara incluso cuando no había elementos en la pila, por lo que cambiar elsetActionBarArrowDependingOnFragmentsBackStack()
método funcionó para mí.fuente
La lógica es clara. Mostrar el botón de retroceso si la pila de fragmentos de respaldo está limpia. Muestre animación de hamburguesa de material si la pila de fragmentos no es clara
fuente
Si echas un vistazo a la aplicación GMAIL y vienes aquí para buscar el ícono de carret / permitdance ..
Le pediría que hiciera esto, ninguna de las respuestas anteriores fue clara. Pude modificar la respuesta aceptada.
NavigationDrawer -> Vista de lista contiene subfragmentos.
los subfragmentos se enumerarán así
firstFragment == position 0 ---> esto tendrá subfragmentos -> fragmento
En firstFragment tienes otro fragmento.
Llama a esto en DrawerActivity
y en fragmento
En el método de actividad del cajón OnBackPressed, configure el alternador del cajón en verdadero para habilitar nuevamente el icono de la lista de navegación.
Gracias Pusp
fuente
¡Puedes mirar este pequeño ejemplo! https://github.com/oskarko/NavDrawerExample
fuente
En mi opinión, el uso de onNavigateUp () (como se muestra aquí ) en la solución de riwnodennyk o Tom es más limpio y parece funcionar mejor. Simplemente reemplace el código onOptionsItemSelected con esto:
fuente