¿Cómo agregar el indicador de "menú" junto al icono de la aplicación de Barra de Acción?

Por lo menos, las aplicaciones de Gmail y Youtube para Android utilizan un menú lateral ( cajón de navegación ?) Que se abre al pasar, o haciendo clic en el icono de la aplicación (botón Inicio):

Introduzca aquí la descripción de la imagen

¿Está el indicador / icono de menú en la captura de pantalla encima de una parte ya hecha del SDK de Android? (¿O un icono personalizado que Google usa en sus aplicaciones?) En cualquier caso, ¿cuál es la manera más fácil de que su botón de inicio se vea así , es decir, como abre un menú?

( targetSdkVersion 18; minSdkVersion 14)

Resolución

Finalmente lo consiguió trabajando . Lo que faltaba para mí era 1) el icono real y 2) la llamada diferida a syncState() en el ActionBarDrawerToggle .

Para crear una implementación / mirada similar en su aplicación, debe usar ActionBarDrawerToggle y configurar su icono personalizado como indicador junto al botón Inicio de ActionBar. Por ejemplo :

 import android.app.ActionBar; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; private void setUpDrawerToggle(){ ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); // ActionBarDrawerToggle ties together the the proper interactions // between the navigation drawer and the action bar app icon. mDrawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ R.string.navigation_drawer_open, /* "open drawer" description for accessibility */ R.string.navigation_drawer_close /* "close drawer" description for accessibility */ ) { @Override public void onDrawerClosed(View drawerView) { invalidateOptionsMenu(); // calls onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); // calls onPrepareOptionsMenu() } }; // Defer code dependent on restoration of previous instance state. // NB: required for the drawer indicator to show up! mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); mDrawerLayout.setDrawerListener(mDrawerToggle); } 

Donde R.drawable.ic_drawer es en realidad el icono a usar como indicador. Lo puedes encontrar en Android Asset Studio ; Consulte Indicador del cajón de navegación .

Referencias

  1. ActionBarDrawerToggle
  2. Creación de un cajón de navegación

Android-Developer y HpTerm me ayudaron en la correcta

  1. Señalar esto es en realidad NavigationDrawer específicos (que ya estaba utilizando como en el ejemplo de Google)
  2. Diciendo dónde encontrar el ícono ic_drawer.png (→ Android Asset Studio )

Ahora, por desgracia, crear ActionBarDrawerToggle como a continuación parece no ser suficiente. Al menos en mi Nexus 7 (API 18) dispositivo de prueba.

 drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_navigation_drawer, R.string.side_menu_open, R.string.side_menu_closed) { // ... }; 

Solución parcial (nivel API 18+)

Encontré una manera de hacer que el indicador aparezca sin embargo: setHomeAsUpIndicator() . La desventaja: este método se añadió en el nivel 18 de la API.

 @Override protected void onCreate(Bundle savedInstanceState) { // ... getActionBar().setDisplayHomeAsUpEnabled(true); // also required if (Build.VERSION.SDK_INT >= 18) { getActionBar().setHomeAsUpIndicator( getResources().getDrawable(R.drawable.ic_navigation_drawer)); } } 

Así que ahora la pregunta sigue siendo: ¿Cómo hacer que esto funcione (en mi caso) para los niveles API 14 a 17?

ic_drawer en un dispositivo 4.1.2 (API 16) que el ícono ic_drawer no aparece. Con setDisplayHomeAsUpEnabled(true) consigo el icono normal de "inicio" (pequeña flecha apuntando a la izquierda) y sin ella, el espacio que queda en el icono de mi aplicación permanece en blanco.

Solución final

Lo conseguí trabajando usando la versión editada de la respuesta de Android-Developer .

Curiosamente, lo que faltaba en mi código de inicialización ActionBarDrawerToggle era:

  // Defer code dependent on restoration of previous instance state. drawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); 

Con eso incluido, no se necesita llamar a setHomeAsUpIndicator() .

La palabra clave aquí es NavigationDrawer ; Hay un ejemplo completo de código de trabajo en el sitio de desarrolladores de Android.

LEA EL FIN DEL ENLACE DADO : Abrir y cerrar con el icono de la aplicación

El siguiente código se copia desde allí

 public class MainActivity extends Activity { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; ... public void onCreate(Bundle savedInstanceState) { ... mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ R.string.drawer_open, /* "open drawer" description */ R.string.drawer_close /* "close drawer" description */ ) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Pass the event to ActionBarDrawerToggle, if it returns // true, then it has handled the app icon touch event if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle your other action bar items... return super.onOptionsItemSelected(item); } ... } 

Algunos archivos están disponibles como descarga y las pequeñas 3 líneas con el efecto de animación se ejemplifican completamente.

Tienes que copiar estos archivos en la carpeta correspondiente. Dependiendo del tema que uses, oscuro o claro tienes un conjunto diferente de iconos.

En mi caso simplemente copié el drawer_shadow.9.png y ic_drawer.png en la carpeta ic_drawer.png y seguí el ejemplo y todo funciona bien.

Los iconos están disponibles en el vínculo que proporcioné, pero NO están en el "Paquete de Iconos de la Barra de Acción", están en la aplicación de ejemplo en las carpetas res / drawable correspondientes .

  • Cómo configurar un observador para actualizar el cajón de navegación después de que el método onActivityResult recibió un resultado de intención
  • Android - Implementación del cajón de navegación en Android 2.2 +
  • Efecto de desplazamiento del menú del cajón de navegación
  • FindViewById (int) en Activity no se puede aplicar a (int, android.support.v7.widget.Toolbar
  • ¿Cómo crear una lista desplegable dentro de un cajón de navegación (en Android)?
  • Menú del cajón secundario
  • Gaveta de navegación (Google+ vs. YouTube)
  • Android Api 23 Cambiar Navegación Ver headerLayout textview
  • ActionLayout para los elementos de la vista de navegación se muestra en el lado derecho
  • Color de fondo ondulado de Android
  • Android DrawerLayout.setDrawerLockMode () no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.