如果你想在抽屉菜单进入屏幕时立即覆盖操作栏,并在抽屉菜单不再可见时恢复操作栏(就像Gmail在2014年3月20日之后的行为一样),可以使用以下代码:
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();
}
最后,在 onCreateOptionsMenu
中填充不同的菜单资源或在 onPrepareOptionsMenu
中根据 mDrawerVisible
的值显示/隐藏不同的操作。