当前位置: 首页 > 知识库问答 >
问题:

活动中的OnOptionsItemSelec在片段中的onOptionsItemSelec之前调用。其他可能的方法?

岳意蕴
2023-03-14

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

        }
    }

我在活动中声明了它,因为我希望每个片段都可以调用它,这样我就不必捕捉android了。R、 id.home在每个片段中的大小写。

在其中一个片段中,我使用setDisplayHomeAsUpEngic(true),这样我就得到了ActionBar图标左侧的小箭头。当在这个片段中单击HomeIcon时,我不想设置Home片段,我想设置最后显示的片段。所以我在片段中有一个onOptionsItemSelec-方法:

@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {

    switch (menuItem.getItemId()) {
    case android.R.id.home:
        setLastFragment();
               return true;
    ...

然而,这不是我想要的工作方式。首先调用活动的onOptionsItemSelected,捕捉菜单项并重定向到HomeFragment。通过在其他片段中声明的其他MenuItems,我可以检查并看到相同的行为。首先调用活动,不捕捉MenuItem(默认情况),然后重定向到super。onOptionsItemSelected(项)。

因此,Android处理菜单点击的方式似乎就是这样。首先是活动,然后是片段。有没有办法改变这一点?我不想把Android系统。R、 id.home-case,并在那里处理。有更好的方法吗?

共有3个答案

周育
2023-03-14

不确定是否可能。在此处提供的官方文档中:

http://developer.android.com/guide/topics/ui/actionbar.html#ActionEvents

有一份说明指出如下:

[...]但是,活动有机会首先处理事件,因此系统首先在活动上调用onOptionsItemSelec(),然后再为片段调用相同的回调。

查修谨
2023-03-14

根据开发商参考,

返回false允许正常菜单处理继续,返回true在此处使用

因此,我会尝试在onOptionsItemSelec()的活动实现中默认返回“false”,这样,如果没有捕获事件,事件将传递给片段的实现。

毋宏茂
2023-03-14

我刚刚遇到了这个问题,我使用以下代码实现了它。在活动的选项项选择功能中,添加:

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

在片段的onOptionsItemSelected方法中,处理相应的事情。通过这种方式,如果片段对菜单项有任何事情要做,它将完成并返回true以停止任何其他进程。如果片段与此项无关,它将返回false或调用super。onOptionsItemSelected方法,该方法最终可能返回false以让其他人处理它。

 类似资料:
  • 问题内容: 我想从其他活动中调用主要活动中的公共方法。我怎样才能做到这一点? 问题答案: 这取决于。 在这种情况下,如果您只想使用某些共享功能(例如执行一些计算的代码)。 我建议将此共享功能移至某些独立的类,然后从那里进行调用。 在这种情况下,如果您想调用MainActivity,则MainActivity使用MainActivity UI进行了某些操作,则您必须使用Intent(http://d

  • 当我创建时,我需要从另一个活动中删除一个片段,而不是创建它的活动: 然后我可以从片段中访问另一个活动,假设片段中有一个按钮可以打开另一个活动,现在,停留在该活动中我想删除启动该活动的片段,我得到该片段的参考号通过意图。所以我尝试: 但它给了我一个nullPointerException, 03-07 22:42:33.270 30993-30993/河马。rggmiranda。hiposleep

  • 用例:我正在开发一个Android应用程序,它有一个带有4个选项卡的视图页码,所有这些选项卡都是片段。对于每个选项卡/片段,我必须连接到具有 Oauth 的 REST Api,并且令牌每 5 分钟过期一次。 当前解决方案:使用RxJava和retryWhen操作符,我可以在收到401 HTTP错误时重新进行身份验证。对于订阅和消费的每个可观察流,使用: 因此,当令牌到期时,流将使用它,然后执行真正

  • 并且显示错误 正如您所看到的,当我单击Button时,我想从CurrentWeatherFragment调用一个方法,从ForecastWeatherFragment调用一个方法。

  • https://github.com/xxv/android-lifecycle显示在onStart活动之前调用片段onAttach、onCreateView和onActivityCreated。但是,我尝试记录这个: FirstFragment如下所示: 它印了这个: 主活动创建 主活动启动 第一个片段 第一片段创建 FirstFra0020 onCreateView 第一片段onActivit