¿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
enmDrawerLayout
.onClick
nunca se llama - Configuración de un
onTouchListener
enmDrawerLayout
.onTouch
nunca se llama -
ActionBarDrawerToggle
yDrawerLayout
. No se pudo encontrar nada comoonDrawerStartedOpening
.
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 }