在使用 Navigation Drawer 时,Android 开发人员建议在 ActionBar 中“只有那些在 Navigation Drawer 中表示的屏幕才应该真正具有 Navigation Drawer 图像”,并且“所有其他屏幕都具有传统的 up carat”。
详情请看这里:http://youtu.be/F5COhlbpIbY
我正在使用一个 Activity 来控制多个级别的 fragment ,并且可以让抽屉导航图像在所有级别上显示和运行。
在创建较低级别的 fragment 时,我可以调用 ActionBarDrawerToggle
setDrawerIndicatorEnabled(false)
来隐藏 Navigation Drawer 图像并显示 Up caret
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag, "lowerFrag").addToBackStack(null).commit();
我遇到的问题是,当我导航回顶层 fragment 时,Up 克拉仍然显示,而不是原始的 Navigation Drawer 图像。关于如何“刷新”顶级 fragment 上的 ActionBar 以重新显示 Navigation Drawer 图像的任何建议?
解决方案
汤姆的建议对我有用。这是我所做的:
主要 Activity
此 Activity 控制应用中的所有 fragment 。
在准备新 fragment 替换其他 fragment 时,我将 DrawerToggle setDrawerIndicatorEnabled(false)
设置如下:
LowerLevelFragment lowFrag = new LowerLevelFragment();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getSupportFragmentManager().beginTransaction().replace(R.id.frag_layout,
lowFrag).addToBackStack(null).commit();
接下来,在 onBackPressed
的覆盖中,我通过将 DrawerToggle 设置为 setDrawerIndicatorEnabled(true)
来恢复上述内容,如下所示:
@Override
public void onBackPressed() {
super.onBackPressed();
// turn on the Navigation Drawer image;
// this is called in the LowerLevelFragments
setDrawerIndicatorEnabled(true)
}
在 LowerLevelFragments 中
在我这样修改 onCreate
和 onOptionsItemSelected
的 fragment 中:
在 onCreate
中添加了 setHasOptionsMenu(true)
以启用配置选项菜单。还要设置 setDisplayHomeAsUpEnabled(true)
以启用操作栏中的 <:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// needed to indicate that the fragment would
// like to add items to the Options Menu
setHasOptionsMenu(true);
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
}
然后在 onOptionsItemSelected
中,每当按下 < 时,它都会从 Activity 中调用 onBackPressed()
以在层次结构中向上移动一层,然后显示抽屉导航图像:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Get item selected and deal with it
switch (item.getItemId()) {
case android.R.id.home:
//called when the up affordance/carat in actionbar is pressed
getActivity().onBackPressed();
return true;
…
}
最佳答案
就像 1-2-3 一样简单。
如果你想达到:
1) Drawer Indicator - 当 Back Stack 中没有 fragment 或 Drawer 已打开时
2) 箭头 - 当一些 Fragment 在 Back Stack 中时
private FragmentManager.OnBackStackChangedListener
mOnBackStackChangedListener = new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
syncActionBarArrowState();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.drawable.ic_navigation_drawer,
0,
0
) {
public void onDrawerClosed(View view) {
syncActionBarArrowState();
}
public void onDrawerOpened(View drawerView) {
mDrawerToggle.setDrawerIndicatorEnabled(true);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener);
}
@Override
protected void onDestroy() {
getSupportFragmentManager().removeOnBackStackChangedListener(mOnBackStackChangedListener);
super.onDestroy();
}
private void syncActionBarArrowState() {
int backStackEntryCount =
getSupportFragmentManager().getBackStackEntryCount();
mDrawerToggle.setDrawerIndicatorEnabled(backStackEntryCount == 0);
}
3) 两个指标根据自己的形状来行动
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.isDrawerIndicatorEnabled() &&
mDrawerToggle.onOptionsItemSelected(item)) {
return true;
} else if (item.getItemId() == android.R.id.home &&
getSupportFragmentManager().popBackStackImmediate()) {
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
附:见 Creating a Navigation Drawer on Android Developers关于 3 线指标行为的其他提示。
关于android - 使用 fragment 时在 Android 抽屉导航图像和向上插入符号之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258020/