4

在我看来,实现中缺少一件事:在抽屉打开之前DrawerLayout触发的事件。

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
  public void onDrawerClosed(View view) {
    //...
  }

  public void onBeforeDrawerOpened(View drawerView) {
    //...
  }

  public void onDrawerOpened(View drawerView) {
    //...
  }
};

需要它的原因是设置抽屉项的状态,例如选择、启用和类似的菜单项。将其放入onDrawerOpened()回调中是可行的,但在打开后更改菜单外观看起来并不正确。

我的第一个想法是扩展ActionBarDrawerToggle并提供新活动。我应该重新发明轮子:-)还是已经有人做过?

4

4 回答 4

8

此链接可以帮助您解决问题。如何检测 DrawerLayout 开始打开?

使用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);
于 2015-11-27T11:56:05.737 回答
3

当我遇到这个问题时,我在谷歌上发现了这个并且在任何地方都没有找到确切的答案,所以我决定发布完整的答案。希望它可以节省一些时间。

我找到的最佳解决方案是监视抽屉状态并使用 isDrawerOpen 方法确定它是打开还是关闭。请务必将重力设置为与打开/关闭抽屉时使用的重力相匹配。

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
// ...
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_playlist, R.string.drawer_open, R.string.drawer_close) {
    public void onDrawerStateChanged(int newState) {
        if(newState == DrawerLayout.STATE_DRAGGING){
            if(mDrawerLayout.isDrawerOpen(Gravity.LEFT)){
                //closing

            }else{
                //opening

            }
        }
    }
}
于 2014-06-27T00:14:53.850 回答
0

已接受答案中推荐的setDrawerListener方法现已弃用。执行此操作的新方法是使用 addDrawerListener 方法。

在科特林

  1. 初始化DrawerLayout视图

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)

  2. 在您的主要活动中,创建一个内部类,它是DrawerLayout.DrawerListener的子类。DrawerLayout 类实现了 DrawerListener 接口。您可以在 onDrawerSlide 中跟踪不断变化的抽屉位置,并确定抽屉是打开还是关闭:

    inner class CustomDrawer : DrawerLayout.DrawerListener{
      override fun onDrawerStateChanged(newState: Int) {
      }
    
    var last: Float = 0f
    
    override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
    
        var opening: Boolean = slideOffset>last
        var closing: Boolean = slideOffset<last
    
        if(opening) {
            Log.i("Drawer","opening")
            Log.d("Last",last.toString())
        } else if(closing) {
            Log.i("Drawer","closing")
            Log.d("Last",last.toString())
        } else {
            Log.i("Drawer","doing nothing")
            Log.d("Last",last.toString())
        }
    }
    
    override fun onDrawerClosed(drawerView: View) {
    
      }
    
    override fun onDrawerOpened(drawerView: View) {
    
      }
    }
    
  3. 将您的自定义 DrawerListener 添加到 DrawerLayout(我将其放在 onCreate 方法中)

    var drawerListener = CustomDrawer()
    drawerLayout.addDrawerListener(drawerListener)
    
于 2020-02-05T06:51:38.687 回答
0

来自 Lenny 和 Fred 对 kotlin 的回答:

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

        override fun onDrawerStateChanged(newState: Int) {
            super.onDrawerStateChanged(newState)

            if(newState == DrawerLayout.STATE_SETTLING){
                if(drawer_layout.isDrawerOpen(Gravity.LEFT)){
                    //closing
                }else{
                    //opening
                }
            }
        }
    }
    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()
于 2019-12-10T22:42:52.137 回答