我有一个活动可以包含几个片段。每个片段都可以在ActionBar中拥有自己的菜单项。到目前为止,这很好,每个项目都是可点击的并执行所需的操作。
我的问题如下。在MainActivity中,我声明了以下行来拦截对ActionBar的HomeIcon的调用:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
clearBackStack();
setHomeFragment();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
我将其声明在Activity中,因为我希望每个Fragment都调用它,这样我就不必在每个Fragment中捕获android.R.id.home的情况。
在一个Fragment中,我使用setDisplayHomeAsUpEnabled(true),以便在ActionBar图标左侧获得小箭头。当在此片段中单击HomeIcon时,我不想设置HomeFragment,而是要设置最后显示的Fragment。因此,我在Fragment中有一个onOptionsItemSelected方法:
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case android.R.id.home:
setLastFragment();
return true;
...
然而,这并没有按照我所期望的方式起作用。Activity 的 onOptionsItemSelected 方法首先被调用,捕获 MenuItem 并重定向到 HomeFragment。我可以在其他片段中声明的其他菜单项中检查相同的行为。Activity 首先被调用,不会捕获 MenuItem(默认情况),然后重定向到 super.onOptionsItemSelected(item)。因此,似乎这是 Android 处理菜单点击的方式。首先是 Activity,然后是 Fragment。有没有办法改变这个?我不想在每个片段中都放置 android.R.id.home-case 并在那里处理它。有没有更好的方法来做这件事?