当使用导航抽屉时,Android开发人员建议在ActionBar中“只有那些在导航抽屉中表示的屏幕实际上应该具有导航抽屉图像”,并且“所有其他屏幕都具有传统的向上克拉” .
详情请见:http://youtu.be/F5COhlbpIbY
我正在使用一个活动来控制多个级别的片段,并且可以使导航抽屉图像在所有级别上显示和运行 .
创建较低级别的片段时,我可以调用 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();
我遇到的问题是当我导航回顶级片段时,向上克拉仍显示而不是原始导航抽屉图像 . 有关如何“刷新”顶级片段上的ActionBar以重新显示导航抽屉图像的任何建议?
解决方案
汤姆的建议对我有用 . 这是我做的:
MainActivity
此活动控制应用程序中的所有片段 .
在准备新片段以替换其他片段时,我将DrawerToggle _988935设置为:
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
,如下所示:
在 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
按下 < 时,它会从活动中调用 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;
…
}
12 回答
您已经写过,要实现较低级别的片段,您将替换现有片段,而不是在新活动中实现较低级别片段 .
我认为你必须手动实现后退功能:当用户按下时,你有代码弹出堆栈(例如在
Activity::onBackPressed
覆盖中) . 所以,无论你做什么,你都可以扭转setDrawerIndicatorEnabled
.这很简单,1-2-3 .
如果你想实现:
1) Drawer Indicator - 当后堆栈中没有碎片或抽屉打开时
2) Arrow - 当一些碎片在后堆栈中时
3)两个指标根据其形状行事
附:有关3行指标行为的其他提示,请参阅Creating a Navigation Drawer on Android Developers .
我用过下一件事:
如果您的向上操作栏按钮不起作用,请不要忘记添加监听器:
我在使用主页按钮实现抽屉导航时遇到了一些麻烦,除了动作按钮外,一切都正常 .
尝试根据DrawerToggle的状态处理MainActivity中的Home项目选择 . 这样您就不必为每个片段添加相同的代码 .
FOLLOW UP
@dzeikei给出的解决方案很简洁,但是当使用碎片时,它可以在后台堆叠为空时自动处理抽屉指示器的设置 .
EDIT
关于@JJD的问题 .
片段在活动中保存/管理 . 上面的代码在该活动中写入一次,但只处理
onOptionsItemSelected
的up插入符号 .在我的一个应用程序中,我还需要在按下后退按钮时处理向上插入符的行为 . 这可以通过覆盖
onBackPressed
来处理 .注意
onOptionsItemSelected
和onBackPressed
之间的代码重复,可以通过创建方法并在两个地方调用该方法来避免 .还要注意我再添加两次
executePendingTransactions
,这在我的情况下是必需的,否则我有时候会有奇怪的插入符号 .我为托管活动创建了一个界面来更新汉堡包菜单的视图状态 . 对于顶级片段,我将切换设置为
true
,对于我想要显示向上的片段<arrow,我将切换设置为false
.然后在我的活动中......
这个answer正在运作,但它有一点问题 . 没有明确调用
getSupportActionBar().setDisplayHomeAsUpEnabled(false)
,即使后台堆中没有任何项目,也会导致抽屉图标被隐藏,因此更改setActionBarArrowDependingOnFragmentsBackStack()
方法对我有用 .逻辑清晰 . 如果片段后栈是清除的,则显示后退按钮 . 如果碎片堆栈不清楚,则显示材料汉堡包动画 .
如果您看一下GMAIL应用程序并来这里搜索carret / compleance图标..
我会请你这样做,上述答案都不清楚 . 我能够修改接受的答案 .
子碎片将像这样列出
firstFragment == position 0 --->这将有subfragments - > fragment
secondFragment
thirdFragment等向前....
在firstFragment中,您有其他片段 .
在DrawerActivity上调用它
并在片段中
在OnBackPressed Drawer活动方法上,将抽屉切换设置为true以再次启用导航列表图标 .
谢谢,Pusp
你可以看看这个小例子! https://github.com/oskarko/NavDrawerExample
IMO,在riwnodennyk 's or Tom'解决方案中使用onNavigateUp()(如图所示here)更清洁,似乎更好用 . 只需用以下代码替换onOptionsItemSelected代码: