Même si RecyclerView ou ViewPager est défini sur DrawerLayout, le mouvement pour fermer le tiroir est prioritaire pour le défilement horizontal, et le défilement vertical et la commutation des onglets sont tirés par le mouvement de fermeture, de sorte qu'il ne peut pas être utilisé confortablement.
Avec les paramètres suivants, vous pouvez arrêter le mouvement pour fermer le tiroir qui se produit lorsque vous faites défiler horizontalement sur le DrawerLayout. Vous pouvez également fermer le tiroir en faisant défiler horizontalement depuis l'extérieur du tiroir.
//Dans Activity etc. où DrawerLayout est défini
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DrawerLayout.DrawerListener drawerListener = new DrawerLayout.DrawerListener() {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
}
@Override
public void onDrawerOpened(View drawerView) {
//Désactiver le défilement horizontal sur le tiroir immédiatement après l'ouverture
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
}
@Override
public void onDrawerClosed(View drawerView) {
//Lorsqu'il est fermé,Activer le défilement horizontal
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
}
@Override
public void onDrawerStateChanged(int newState) {
//Il y a un changement d'état avec le tiroir ouvert,Lorsque le tiroir est à nouveau ouvert,Désactiver le défilement horizontal sur le tiroir
if (newState == DrawerLayout.STATE_IDLE && mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
}
}
};
mDrawerLayout.addDrawerListener(drawerListener);
mDrawerLayout.setOnTouchListener((v, event) -> {
//Lorsque vous touchez l'extérieur du tiroir,Activer le défilement horizontal
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT) && event.getAction() == MotionEvent.ACTION_DOWN) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
}
return false;
});
}