63

そのため、Navigation Drawerが開き始めたときに非表示にしたいタブがあります。私が持っているコードは、開いたときにそれらを非表示にしますが、それは私が望むものではありません.

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

これが私が試したことです:

  • を に設定onClickListenermDrawerLayoutます。onClick呼び出されることはありません
  • を に設定onTouchListenermDrawerLayoutます。onTouch呼び出されることはありません
  • 研究ActionBarDrawerToggleDrawerLayoutクラス。のようなものが見つかりませんでしonDrawerStartedOpeningた。
4

8 に答える 8

86

非推奨:より適切な解決策については、他の回答を参照してください

これを行うには、次の 2 つの方法があります。

  1. onDrawerSlide(View drawerView, float slideOffset)コールバックを使用

slideOffset0 から 1 に変化します。1完全に開いていることを意味します0。 - 閉じています。

オフセットが から - に変わると、0オープンプロセスが開始さ!0れたことを意味します。何かのようなもの:

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);
  1. onDrawerStateChanged(int newState)コールバックを使用

状態をリッスンする必要がありますSTATE_SETTLING。この状態は、引き出しが動き始める (開閉する) たびに報告されます。したがって、この状態が表示されたら、ドロワーが現在開いているかどうかを確認し、それに応じて行動してください。

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);
于 2014-04-29T19:26:37.487 に答える
46

Pavel Dudka による現在受け入れられている回答は、既に廃止されています。mDrawerLayout.addDrawerListener()代わりにメソッドを使用してリスナーを設定してください。

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

完璧に動作します。乾杯!

于 2017-04-03T12:20:48.623 に答える
12

DrawerLayout.DrawerListener のメソッドをオーバーライドしてみてください

@Override
public void onDrawerStateChanged(int newState) {
    if( newState == DrawerLayout.STATE_DRAGGING && isDrawerOpen() == false ) {
        // this where Drawer start opening
    }
}
于 2014-04-29T19:28:08.663 に答える
10

コトリンの場合

var toggle = object : ActionBarDrawerToggle(this,
                drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

            override fun onDrawerOpened(drawerView: View) {
                super.onDrawerOpened(drawerView)
            }
        }
drawer_layout.addDrawerListener(toggle)
toggle.syncState()
于 2018-11-12T10:17:42.143 に答える