如果您想在抽屉进入屏幕后立即覆盖操作栏并在抽屉不再可见时恢复操作栏(与 2014 年 3 月 20 日的 Gmail 行为完全相同),您可以使用以下代码:
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
boolean isOpened = mDrawerLayout.isDrawerOpen(mDrawerList);
boolean isVisible = mDrawerLayout.isDrawerVisible(mDrawerList);
if (!isOpened && !isVisible) {
if (newState == DrawerLayout.STATE_IDLE) {
// drawer just hid completely
restoreActionBar();
} else {
// } else if (newState == DrawerLayout.STATE_SETTLING) {
// drawer just entered screen
overrideActionBar();
}
}
}
private void restoreActionBar() {
getSupportActionBar().setTitle(mTitle);
supportInvalidateOptionsMenu();
}
private void overrideActionBar() {
getSupportActionBar().setTitle(mDrawerTitle);
supportInvalidateOptionsMenu();
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
根据需要修改restoreActionBar() 和overrideActionBar() 方法。
无需区分滑动和主页按钮,无需测量滑动长度。
变化
如果您不想引用抽屉列表视图,请改用以下代码:
boolean isOpened = mDrawerLayout.isDrawerOpen(GravityCompat.START);
boolean isVisible = mDrawerLayout.isDrawerVisible(GravityCompat.START);
您可能希望使用GravityCompat.END 代替,具体取决于您在 XML 布局中指定的内容。
编辑 - 相关操作
上面的示例没有隐藏与导航抽屉下方的内容相关的操作栏项目。要这样做或在抽屉可见时显示不同的图标集,您必须跟踪抽屉是手动打开还是关闭。
除了上述代码之外,还声明 private boolean mDrawerVisible = false 并进行适当的保存/恢复状态处理。
然后修改mDrawerToggle内部方法如下:
private void restoreActionBar() {
getSupportActionBar().setTitle(mTitle);
mDrawerVisible = false;
supportInvalidateOptionsMenu();
}
private void overrideActionBar() {
getSupportActionBar().setTitle(mDrawerTitle);
mDrawerVisible = true;
supportInvalidateOptionsMenu();
}
最后在onCreateOptionsMenuinflate不同的菜单资源或在onPrepareOptionsMenu根据mDrawerVisible的值显示/隐藏不同的动作。