Animación ActionBarDrawerToggle

Estoy usando el ActionBarDrawerToggle de la librería appcompat v7 en mi aplicación y tengo algunos problemas con la animación de menú a flecha. De acuerdo con las directrices de diseño del material, el cajón de navegación debe superponerse a la barra de herramientas y la animación del icono no debe utilizarse al abrir el cajón, según entiendo.

¿Por qué se activa la animación de forma predeterminada al abrir / cerrar el cajón de navegación y cómo puedo desactivarlo?

Además, ¿cómo puedo activar la animación en otras ocurrencias? He encontrado esta solución, pero sólo funciona para Android API 11+ y su sobrescrita por llamar a setDrawerIndicatorEnabled(false) o por un ActionView ampliado en la barra de herramientas.

Cuando crea su ActionBarDrawerToggle, hágalo de esta manera para desactivar la animación / flecha y mostrar siempre una hamburguesa:

 drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, getToolbar(), R.string.open, R.string.close) { @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state } @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, 0); // this disables the animation } }; 

Me encontré con este problema tooday y encontró simple y (I belive) una solución adecuada:

Simplemente no establezca la instancia de ActionBarDrawerToggle como DrawerListener para su DrawerLayout. De esta manera ActionBarDrawerToggle no realizará la animación que depende del desplazamiento de la diapositiva del cajón.

Si necesita un oyente para DrawerLayout use DrawerLayout.DrawerListener.

Editar: También puede establecer ActionBarDrawerToggle como un oyente, pero que debe overide su método onDrawerSlide. Por ejemplo:

  mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open_desc, R.string.drawer_close_desc) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, 0); } }; 

Llamando a super.onDrawerSlide() con valor 0 en lugar de slideOffset, deshabilita la animación

Agrega DrawerArrowStyle en tu Tema como arriba. Lo hace el truco …

 <style name="AppTheme" parent="Theme.AppCompat.NoActionBar"> <!-- Customize your theme here. --> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <item name="spinBars">true</item> <item name="color">@android:color/white</item> </style> 

Ejemplo de actividad

 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar); DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ); mDrawerLayout.setDrawerListener(mDrawerToggle); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); mDrawerToggle.syncState(); } 

Sé que estoy super tarde …

Haga esto en la actividad:

 drawerToggle.setDrawerIndicatorEnabled(false); 

En el tema styles.xml. Hacer esto:

 <item name="android:homeAsUpIndicator">@drawable/menu_icon</item> 
 mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close ) { public void onDrawerClosed(View view) { super.onDrawerClosed(view); invalidateOptionsMenu(); syncState(); } public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); syncState(); mLeftMenuFrame.bringToFront(); mRightMenuFrame.bringToFront(); } }; mDrawerToggle.setDrawerIndicatorEnabled(true); mDrawerLayout.setDrawerListener(mDrawerToggle); mToolbar.inflateMenu(R.menu.menu_main); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mDrawerToggle.syncState(); 
  • ¿Cómo personalizar los elementos de menú en NavigationView como GMail App
  • Nuevo ícono oficial para Android Navigation Drawer
  • ¿Cómo abrir el submenú después de hacer clic en el elemento de menú en el cajón de navegación?
  • ¿Cómo abrir un nuevo fragmento del cajón de navegación?
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • Cómo actualizar la lista del cajón de navegación tan pronto como su abrir / cerrar en Android
  • Cajón de navegación - ¿qué hace syncState () y por qué debe llamarse dentro onPostCreate ()?
  • ¿Cuál es el propósito de las herramientas: openDrawer = "start" al crear un DrawerLayout (con NavigationView) desde el asistente?
  • ¿Cómo puedo hacer que DrawerLayout se muestre debajo de la barra de herramientas?
  • Cajón de navegación coexistente y diseño de panel deslizante
  • ¿Cómo mostrar el cajón de navegación en todas las actividades?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.