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
amDrawerLayout
.onClick
nunca se llama - Configurando un
onTouchListener
amDrawerLayout
.onTouch
nunca se llama - Se investigaron las clases
ActionBarDrawerToggle
yDrawerLayout
. No se pudo encontrar nada comoonDrawerStartedOpening
.
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.