在使用 Navigation Drawer 时,Android 开发人员建议在 ActionBar 中“只有那些在 Navigation Drawer 中表示的屏幕才应该真正具有 Navigation Drawer 图像”,并且“所有其他屏幕都具有传统的 up carat”。
我正在使用一个活动来控制多个级别的片段,并且可以让导航抽屉图像在所有级别上显示和运行。
创建较低级别的片段时,我可以调用ActionBarDrawerToggle setDrawerIndicatorEnabled(false)隐藏导航抽屉图像并显示向上插入符号
ActionBarDrawerToggle
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, "lowerFrag").addToBackStack(null).commit();
我遇到的问题是,当我导航回顶层片段时,Up 克拉仍然显示,而不是原始的 Navigation Drawer 图像。关于如何“刷新”顶级片段上的 ActionBar 以重新显示 Navigation Drawer 图像的任何建议?
汤姆的建议对我有用。这是我所做的:
此活动控制应用程序中的所有片段。
在准备新的片段来替换其他片段时,我将 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):
onBackPressed
setDrawerIndicatorEnabled(true)
@Override public void onBackPressed() { super.onBackPressed(); // turn on the Navigation Drawer image; // this is called in the LowerLevelFragments setDrawerIndicatorEnabled(true) }
在我修改的片段中onCreate,onOptionsItemSelected如下所示:
onCreate
onOptionsItemSelected
onCreate添加以setHasOptionsMenu(true)启用配置选项菜单。还设置setDisplayHomeAsUpEnabled(true)为启用操作栏中的 < :
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每当按下 < 时,它都会从活动中调用onBackPressed()以在层次结构中向上移动一级并显示导航抽屉图像:
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; ... }
您已经写过,要实现较低级别的片段,您将替换现有的片段,而不是在新活动中实现较低级别的片段。
我认为您将不得不手动实现后退功能:当用户按下后您有弹出堆栈的代码(例如在Activity::onBackPressed覆盖中)。因此,无论您在哪里执行此操作,都可以反转setDrawerIndicatorEnabled.
Activity::onBackPressed
setDrawerIndicatorEnabled