android - 如何检测 DrawerLayout 开始打开?

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

这是我尝试过的:

  • onClickListener 设置为 mDrawerLayoutonClick 永远不会被调用
  • onTouchListener 设置为 mDrawerLayoutonTouch 永远不会被调用
  • 研究了 ActionBarDrawerToggleDrawerLayout 类。找不到类似 onDrawerStartedOpening 的内容。

最佳答案

已弃用:查看其他答案以获得更合适的解决方案

有两种可能的方法来做到这一点:

  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);
  1. 使用onDrawerStateChanged(int newState)回调

你需要听STATE_SETTLING states - 每当抽屉开始移动(打开或关闭)时都会报告此状态。所以一旦你看到这个状态 - 检查抽屉现在是否打开并采取相应的行动:

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

关于android - 如何检测 DrawerLayout 开始打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373257/

相关文章:

android - 如何在我的安卓音乐应用程序中显示音频均衡器?

php - 如何从mysql数据库连接多个表并在android中使用 View 列表显示

Android:如何更改 Navigation Drawer onBackPressed() 中的选定项?

java - 单击抽屉导航的项目不会打开 fragment

安卓抽屉导航

java - 抽屉导航没有折叠,没有汉堡按钮

android - 打开第二个抽屉布局作为第一个抽屉布局的子抽屉布局

android - Canvas : clear rect but keep the rest of the content

c# - 在 StreamingAssetsPath 上读取和写入文件

android - toolbar.setNavigationOnClickListener 不工作