如何在ContextMenu中使用MenuItem.setIntent()

问题描述 投票:1回答:3

我有一个上下文菜单,其中包含一个应该启动意图的菜单项:

@Override
public void onCreateContextMenu(ContextMenu menu, View view,
        ContextMenuInfo menuInfo) {
    MenuItem item = menu.add(menuItemText);
    item.setIntent(intent);

这曾经有用,但在较新的Android版本中,它会引发异常:

从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?

添加此标志将是简单的方法,但我不想创建新任务,因为这应该是应用程序的活动堆栈的一部分。问题是系统调用startActivity这个项目的上下文,在这种情况下是DecorContext,而不是Activity。由于这都是由框架处理的,所以我无法控制它。

除了在onContextItemSelected中设置标志或处理操作之外,还有一个很好的解决方案吗?

android android-intent android-activity android-context android-menu
3个回答
0
投票

这是因为Android使用DecorContext进行从Android 27开始的活动。

You can see the change here

您可以通过查看line 319 in PhoneWindow内部在系统级别确认这一点。请注意,当PhoneWindow从Activity构造时,mUseDecorContext始终设置为true。这意味着您的菜单将每次都使用DecorContext构建。

我的理解是,有一个单独的DecorContextContextMenu是故意的。 ContextMenus旨在“浮动”在内容之上,因此作为单独的菜单,与其呈现的内容相关。

根据你使用的ContextMenu,你可能不得不考虑等到Intent直到onContextItemSelected,即使你提到你想避免这种情况。或者,您可能必须使用某种形式的IPC来包装并将您的意图发送回活动。我们使用RxBus模式来处理这种罕见的用例。其他选择是LocalBroadcastManagerEventBus by GreenRobot。希望这有助于您开始使用替代解决方案。如果您有疑问,请告诉我。


-1
投票

例外是因为您可能没有覆盖onContextItemSelected方法。您必须覆盖onContextItemSelected(),如下所示:

@Override
  public boolean onContextItemSelected(MenuItem item) {
    startActivity(item.getIntent());
    return true;
  }

希望这会帮助你。


-1
投票

你可以试试

@Override
public void onCreateContextMenu(ContextMenu menu, View view,
        ContextMenuInfo menuInfo) {
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
    MenuItem item = menu.add(menuItemText);
    item.setIntent(intent);
}

我是android studio应用程序的新手,所以我不确定是否会有效。

© www.soinside.com 2019 - 2024. All rights reserved.