Java
Android

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;
        });
    }