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

时间:2019-03-24 01:37:28

标签: android android-intent android-activity android-context android-menu

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

@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中的操作以外,还有其他解决方案吗?

3 个答案:

答案 0 :(得分:0)

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

You can see the change here

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

我的理解是,为DecorContext单独设置ContextMenu是有意的。 ContextMenus用于在内容上方“浮动”,因此可以与显示内容的菜​​单分开使用。

根据您使用ContextMenu的用途,即使您提到要避免这种情况,也可能必须考虑等待构建Intent直到onContextItemSelected。或者,您可能必须使用某种形式的IPC来包装意图并将其发送回活动。对于这种罕见的用例,我们使用RxBus模式。备选选项为LocalBroadcastManagerEventBus by GreenRobot。希望这可以帮助您入门替代解决方案。让我知道你是否有疑问。

答案 1 :(得分:-1)

异常是因为您可能没有重写onContextItemSelected方法。您必须如下重写onContextItemSelected():

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

希望这会对您有所帮助。

答案 2 :(得分:-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应用程序的新手,所以我不确定它们中的哪一个都可以。