studio ejemplo desde crear cero actionbardrawertoggle android navigation-drawer drawerlayout drawertoggle

android - ejemplo - ¿Cómo detectar que DrawerLayout comenzó a abrirse?



navigation drawer kotlin android (6)

Hay 2 formas posibles de hacerlo:

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

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

Una vez que el desplazamiento 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) Utilice la devolución de llamada onDrawerStateChanged(int newState)

STATE_SETTLING escuchar los estados STATE_SETTLING : este estado se informa cada vez que el cajón comienza a moverse (se abre o se cierra). Entonces, una vez que vea este estado, verifique si el cajón está abierto ahora y actúe 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);

Así que tengo pestañas que quiero ocultar cuando se abre el Cajón de navegación. El código que tengo los oculta cuando terminó de abrirse, 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é:

  • Configurando un onClickListener a mDrawerLayout . onClick nunca se llama
  • Configurando un onTouchListener a mDrawerLayout . onTouch nunca se llama
  • Se investigaron las clases ActionBarDrawerToggle y DrawerLayout . No se pudo encontrar nada como onDrawerStartedOpening .

La respuesta aceptada actualmente por Pavel Dudka ya está en desuso. Por el mDrawerLayout.addDrawerListener() use el método mDrawerLayout.addDrawerListener() para establecer un oyente.

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!


intentar 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 } }


la respuesta de fookwood no funcionó para mí, pero una ligera modificación en la sentencia if 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 }


Solución actualizada:

Como otros han sugerido, la respuesta actual está desactualizada y se recomienda utilizar mDrawerLayout.addDrawerListener() . Una solución de trabajo sería entonces:

mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerStateChanged(int newState) { if (newState == DrawerLayout.STATE_SETTLING && !mDrawerLayout.isDrawerOpen(GravityCompat.START)) { // Drawer started opening } } });

Naturalmente, reemplace GravityCompat.START con lo que identifique su cajón (ID de diseño o su ubicación de gravedad).

Además, si desea detectar cuándo el cajón comienza a cerrarse, simplemente puede hacer:

mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerStateChanged(int newState) { if (newState == DrawerLayout.STATE_SETTLING) { if (!mDrawerLayout.isDrawerOpen(GravityCompat.START)) { // Drawer started opening } else { // Drawer started closing } } } });


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.