活动中的OnOptionsItemSelected在fragment中的onOptionsItemSelected之前调用.其他方式可能吗?

MrH*_*ill 12 android android-menu android-fragments android-fragmentactivity

我有一个可以包含几个片段的活动.每个片段都可以在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);

        }
    }
Run Code Online (Sandbox Code Playgroud)

我在Activity中声明了它,因为我希望每个Fragment都应该调用它,这样我就不必捕获每个片段中的android.R.id.home情况.

在一个片段中,我使用的是setDisplayHomeAsUpEnabled(true),因此我得到了ActionBar图标左侧的小箭头.当在这个片段中单击HomeIcon时,我不想设置HomeFragment,我想设置上次显示的片段.所以我有一个onOptionsItemSelected - 片段中的方法:

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {

    switch (menuItem.getItemId()) {
    case android.R.id.home:
        setLastFragment();
               return true;
    ...
Run Code Online (Sandbox Code Playgroud)

然而,这并不像我希望的那样工作.首先调用Activity的onOptionsItemSelected,捕获MenuItem并重定向到HomeFragment.使用在其他片段中声明的其他MenuItems,我可以检查看到相同的行为.首先调用Activity,不捕获MenuItem(默认情况),然后重定向到super.onOptionsItemSelected(item).

因此,Android处理菜单点击的情况似乎就是这样.第一个活动,然后是片段.有没有办法改变这个?我不想把android.R.id.home-case放在每个片段中并在那里处理它.有没有更好的方法来做到这一点?

Sur*_*ely 13

我刚刚遇到这个问题,我使用以下代码使其工作.在活动的onOptionsItemSelected功能中,添加:

if (id == android.R.id.home){
        Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.container);
        if(null != currentFragment && currentFragment.onOptionsItemSelected(item)){
            return true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在片段的onOptionsItemSelected方法中,您处理相应的事情.这样,如果片段对菜单项有任何操作,它将执行此操作并返回true以停止任何其他进程.如果片段与此项没有任何关系,它将返回false或调用super.onOptionsItemSelected方法,该方法最终可能返回false以让其他人处理它.


dan*_*ani 5

根据开发商的参考,

“返回 false 以允许正常的菜单处理继续进行,true 则在此处使用它。”

所以我会尝试在 Activity 的 onOptionsItemSelected() 实现中默认返回 'false',这样如果没有被捕获,事件将传递给 Fragment 的实现。

  • 这不是希尔先生所要求的!我面临同样的问题。通常,活动处理“Home UP”按钮。有时我们想要在某个片段当前处于活动状态时按下“Home UP”按钮时执行特殊操作。在 Activity onOptionsItemSelected 上返回 false 会阻止 Activity 处理这种情况。 (11认同)