如何检测DrawerLayout是否开始打开?

Ole*_*siy 53 android navigation-drawer drawerlayout drawertoggle

因此,当导航抽屉开始打开时,我有要隐藏的标签.我完成打开时隐藏了它们的代码,但这不是我想要的.

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);
Run Code Online (Sandbox Code Playgroud)

这是我试过的:

  • 设置onClickListenermDrawerLayout.onClick永远不会被召唤
  • 设置onTouchListenermDrawerLayout.onTouch永远不会被召唤
  • 研究ActionBarDrawerToggleDrawerLayout课程.找不到类似的东西onDrawerStartedOpening.

Pav*_*dka 77

有两种可能的方法:

1)使用onDrawerSlide(View drawerView, float slideOffset)回调

slideOffset从0变为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);
Run Code Online (Sandbox Code Playgroud)

2)使用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);
Run Code Online (Sandbox Code Playgroud)

  • 在使用`onDrawerSlide`时,获得大量弃用的代码通知和"无法解决isDrawerOpen()"错误...是否有更新的答案? (7认同)
  • `setDrawerListener` 已弃用。更改为`addDrawerListener`。https://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html (2认同)

Kir*_*zin 34

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.
        }
    });
Run Code Online (Sandbox Code Playgroud)

完美的工作.干杯!

  • 也可以使用“ DrawerLayout.SimpmleDrawerListener”,它为不需要的东西提供无操作。 (2认同)

foo*_*ood 10

尝试覆盖DrawerLayout.DrawerListener的方法

@Override
public void onDrawerStateChanged(int newState) {
    if( newState == DrawerLayout.STATE_DRAGGING && isDrawerOpen() == false ) {
        // this where Drawer start opening
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 未定义isDrawerOpen()。这个从哪里来? (2认同)

Kis*_*nki 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()
Run Code Online (Sandbox Code Playgroud)


NoH*_*Dan 7

最新解决方案:

正如其他人所建议的那样,当前答案已过时,建议使用mDrawerLayout.addDrawerListener()。一个有效的解决方案是:

mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
        @Override
        public void onDrawerStateChanged(int newState) {
            if (newState == DrawerLayout.STATE_SETTLING && !mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
                // Drawer started opening
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

自然地,GravityCompat.START用标识您抽屉的任何东西(布局ID或它的重力〜位置)代替。

另外,如果要检测抽屉何时开始关闭,则只需执行以下操作:

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
                }
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)