我有一个上下文菜单,其中包含一个应该启动意图的菜单项:
@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
中的操作以外,还有其他解决方案吗?
答案 0 :(得分:0)
这是因为Android从Android 27开始使用DecorContext
进行活动。
您可以通过查看line 319 in PhoneWindow的内部内容在系统级别进行确认。请注意,从活动构造PhoneWindow
时,mUseDecorContext
始终设置为true。这意味着您的菜单每次都将使用DecorContext构建。
我的理解是,为DecorContext
单独设置ContextMenu
是有意的。 ContextMenus
用于在内容上方“浮动”,因此可以与显示内容的菜单分开使用。
根据您使用ContextMenu
的用途,即使您提到要避免这种情况,也可能必须考虑等待构建Intent
直到onContextItemSelected
。或者,您可能必须使用某种形式的IPC来包装意图并将其发送回活动。对于这种罕见的用例,我们使用RxBus模式。备选选项为LocalBroadcastManager
和EventBus 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应用程序的新手,所以我不确定它们中的哪一个都可以。