Appcompatv7 – v21 El cajón de navegación no muestra el icono de hamburguesa

Estoy implementando el cajón de navegación de estilo lollipop con la última biblioteca de soporte appcompat, pero el problema es que el icono de hamburguesa nunca se muestra. Sólo se muestra el icono posterior.

Este es mi código de actividad

import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.View; public class Home extends ActionBarActivity { private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); initViews(); } private void initViews(){ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); toolbar.setTitleTextColor(getResources().getColor(android.R.color.white)); setSupportActionBar(toolbar); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar , R.string.drawer_open, R.string.drawer_close) { /** Called when a drawer has settled in a completely closed state. */ public void onDrawerClosed(View view) { super.onDrawerClosed(view); //getActionBar().setTitle(mTitle); //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } /** Called when a drawer has settled in a completely open state. */ public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); //getActionBar().setTitle(mDrawerTitle); //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; // Set the drawer toggle as the DrawerListener mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } } 

Este es mi archivo de estilos

  <resources> <!-- Application theme. --> <style name="Theme.Test" parent="@style/Theme.AppCompat.Light"> <!-- customize the color palette --> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> <item name="windowActionBar">false</item> <item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item> </style> <style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style> 

El archivo de diseño

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" app:theme="@style/ThemeOverlay.AppCompat.ActionBar" /> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/toolbar"> <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- The navigation drawer --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </android.support.v4.widget.DrawerLayout> </RelativeLayout> 

Cajón de navegación que muestra el botón Atrás

Cajón de navegación que muestra el botón Atrás

En ambos casos sólo se muestra la flecha hacia atrás, he leído muchos puestos, pero nada parece hacer una diferencia. Cualquier ayuda sería apreciada.

Tienes que llamar

 mDrawerToggle.syncState(); 

Asegúrese de que está importando el conmutador del cajón correcto.

Cuando importé la versión v4 tuve la flecha (abajo).

 import android.support.v4.app.ActionBarDrawerToggle; 

Cambiarlo a esto (abajo, v7) arregló mi problema.

 import android.support.v7.app.ActionBarDrawerToggle; 

Cuando se utiliza el ActionBarDrawerToggle, debe llamar durante onPostCreate () y onConfigurationChanged ()

  @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); // Pass any configuration change to the drawer toggls mDrawerToggle.onConfigurationChanged(newConfig); } 

Asegúrese de que llame

mDrawerToggle.syncState();

Después de llamar

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); 

Debido a que mi NavegadorDrawer estaba ampliando un Fragmento no una Actividad, no pude reemplazar postCreate. Lo que sigue es lo que hice.

  ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the back icon actionBar.setHomeButtonEnabled(true); // makes it clickable actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon 

¡Espero eso ayude!

No olvide anular el método onOptionsItemSelected y comprobar si se ha hecho clic en ctionBarDrawerToggle, en este caso devolver true de lo contrario la actividad se terminará.

 @Override public boolean onOptionsItemSelected(MenuItem item) { if (actionBarDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } 

mDrawerToggle.syncState() no funcionó para mí, pero finalmente conseguí que funcionara con:

 getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon); 

Yo, sin embargo, no estaba usando una barra de herramientas.

Usted puede simplemente utilizar esto:

 // Defer code dependent on restoration of previous instance state. mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer); } }); 

Incluyendo ActionBarDrawerToggle, asegúrese de usar el método post:

 mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); 

Puede llamar a syncState () desde OnPostCreate de su actividad para sincronizar el indicador con el estado del DrawerLayout vinculado después de que se haya producido onRestoreInstanceState.

 @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } 

También ActionBarDrawerToggle se puede utilizar directamente como DrawerLayout.DrawerListener, o si ya está proporcionando su propio oyente, llame a través de cada uno de los métodos de escucha de su propio.

 private ActionBarDrawerToggle mDrawerToggle; private DrawerLayout mDrawerLayout; . . . . mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerLayout.post(new Runnable() { @Override public void run() { mDrawerToggle.syncState(); } }); 

El cajón de navegación no se muestra al hacer clic en el menú de la barra de acción. Esto me lo arregló.

  @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } //add your switch statement return super.onOptionsItemSelected(item); } 

Esto funciona para mí. He extendido AppCompatActivity en lugar de ActionBarActivity.

 mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) { @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if( getSupportActionBar()!= null) getSupportActionBar().setTitle(R.string.drawer_opened); mActionBarDrawerToggle.syncState(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); if(getSupportActionBar() != null) getSupportActionBar().setTitle(R.string.drawer_closed); mActionBarDrawerToggle.syncState(); } }; 

También tengo problema similar, en mi caso el problema era, al iniciar actionbartoggle, no estaba pasando el argumento barra de herramientas válida (barra de herramientas se inicializó más tarde), sin una barra de herramientas adecuada, no nula, ActionBarToggle no creará un icono de hamburguesa.

 actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
  • Diseño del menú emergente en Android 5.0
  • Cómo agregar footer a NavigationView - Android diseño de la biblioteca de diseño?
  • Android Dex: No se puede ejecutar DX
  • Fragmento anidado con referencia de actividad incorrecta después del cambio de configuración
  • Android Studio build error - Múltiples archivos dex define Landroid / support / v4 /
  • Android.app Fragments vs. android.support.v4.app usando ViewPager?
  • Clase FileProvider de Android no encontrada en versiones de lanzamiento
  • No se encuentra la biblioteca de soporte de preferencias v7 en Eclipse ADT
  • Error de la biblioteca de soporte técnico de Android 23.2.0 al establecer style = "@ style / Widget.AppCompat.Button.Colored"
  • Cómo utilizar AutoScrollHelper
  • Android SearchView no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.