Edited at

Navigation Drawer上にRecyclerViewやViewPagerを設定しているときに、横スクロールの動きをいい感じにするTips

More than 1 year has passed since last update.

DrawerLayout上にRecyclerViewやViewPagerを設定しても、横方向のスクロールはDrawerを閉じる動きが優先され、縦方向のスクロールやTabの切り替えなどが閉じる動きに引っ張られ、気持ちよく操作出来ません。

下記の設定で、DrawerLayout上で横スクロール操作した時に発生するDrawerを閉じる動きを殺すことが出来ます。

Drawerを閉じる操作も、Drawerの外側から横スクロールすることで可能です。

    // DrawerLayoutを設定しているActivityなどで

@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) {
// 開いた直後のドロア上の横スクロールを無効化
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
}

@Override
public void onDrawerClosed(View drawerView) {
// 閉じた時, 横スクロールを有効化
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
}

@Override
public void onDrawerStateChanged(int newState) {
// ドロアが開いている状態で状態に変化があり,再度ドロアが開いた状態になったとき, ドロア上の横スクロールを無効化
if (newState == DrawerLayout.STATE_IDLE && mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
}
}
};

mDrawerLayout.addDrawerListener(drawerListener);
mDrawerLayout.setOnTouchListener((v, event) -> {
// ドロアの外側に触れた時, 横スクロールを有効化
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT) && event.getAction() == MotionEvent.ACTION_DOWN) {
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNDEFINED);
}
return false;
});
}