¿Cómo detectar que el DrawerLayout comenzó a abrirse?

Así que tengo pestañas que quiero ocultar cuando el cajón de navegación empieza a abrirse. El código que tengo los oculta cuando termina de abrir, pero no es lo que quiero.

mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close ) { @Override public void onDrawerClosed(View view) { invalidateOptionsMenu(); setActionBarMode(ActionBar.NAVIGATION_MODE_TABS); } @Override public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); setActionBarMode(ActionBar.NAVIGATION_MODE_STANDARD); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); 

Esto es lo que intenté:

  • Establecer onClickListener en mDrawerLayout . onClick nunca se llama
  • Configuración de un onTouchListener en mDrawerLayout . onTouch nunca se llama
  • ActionBarDrawerToggle y DrawerLayout . No se pudo encontrar nada como onDrawerStartedOpening .

Hay dos formas posibles de hacerlo:

1) Use onDrawerSlide(View drawerView, float slideOffset) devolución de llamada

slideOffset cambia de 0 a 1. 1 significa que está completamente abierto, 0 – cerrado.

Una vez que el offset cambia de 0 a !0 – significa que comenzó el proceso de apertura. Algo como:

 mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close ) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (slideOffset == 0 && getActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_STANDARD) { // drawer closed getActionBar() .setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); invalidateOptionsMenu(); } else if (slideOffset != 0 && getActionBar().getNavigationMode() == ActionBar.NAVIGATION_MODE_TABS) { // started opening getActionBar() .setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); invalidateOptionsMenu(); } super.onDrawerSlide(drawerView, slideOffset); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); 

2) Usar la devolución de llamada onDrawerStateChanged(int newState)

Necesita escuchar los estados STATE_SETTLING : este estado se informa cuando el cajón comienza a moverse (se abre o se cierra). Así que una vez que vea este estado – comprobar si el cajón se abre ahora y actuar en consecuencia:

 mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close ) { @Override public void onDrawerStateChanged(int newState) { if (newState == DrawerLayout.STATE_SETTLING) { if (!isDrawerOpen()) { // starts opening getActionBar() .setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } else { // closing drawer getActionBar() .setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); } invalidateOptionsMenu(); } } }; mDrawerLayout.setDrawerListener(mDrawerToggle); 

La respuesta actualmente aceptada por Pavel Dudka ya está obsoleta. En su lugar, utilice el método mDrawerLayout.addDrawerListener() para establecer un listener.

 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { //Called when a drawer's position changes. } @Override public void onDrawerOpened(View drawerView) { //Called when a drawer has settled in a completely open state. //The drawer is interactive at this point. // If you have 2 drawers (left and right) you can distinguish // them by using id of the drawerView. int id = drawerView.getId(); // id will be your layout's id: for example R.id.left_drawer } @Override public void onDrawerClosed(View drawerView) { // Called when a drawer has settled in a completely closed state. } @Override public void onDrawerStateChanged(int newState) { // Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING. } }); 

Funciona perfectamente. ¡Aclamaciones!

Intenta anular un método de DrawerLayout.DrawerListener

 @Override public void onDrawerStateChanged(int newState) { if( newState == DrawerLayout.STATE_DRAGGING && isDrawerOpen() == false ) { // this where Drawer start opening } } 
 drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close){ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); app.sendScreenView("Menu"); } }; drawer.setDrawerListener(toggle); toggle.syncState(); 

Es la mejor manera.

Fookwood respuesta no funcionó para mí, pero una ligera modificación en la declaración si hizo el truco)

 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, navigationDrawerLayout, topToolbar, R.string.open_drawer, R.string.close_drawer) { @Override public void onDrawerStateChanged(int newState) { if (newState == DrawerLayout.STATE_SETTLING && !navigationDrawerLayout.isDrawerOpen(navigationDrawerView)) { // this where Drawer start opening } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.