Как использовать MenuItem.setIntent () в ContextMenu - PullRequest
1 голос
/ 24 марта 2019

У меня есть контекстное меню с пунктом меню, который должен начинать намерение:

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

Раньше это работало, но в новых версиях Android выдает исключение:

Для вызова startActivity () вне контекста Activity требуется флаг FLAG_ACTIVITY_NEW_TASK. Вы действительно этого хотите?

Добавление этого флага было бы простым выходом, но я не хочу создавать новую задачу, поскольку она должна быть частью стека активности приложения. Проблема в том, что система вызывает startActivity, что является контекстом элемента, который в данном случае является DecorContext, а не Activity. Поскольку все это обрабатывается платформой, я не могу это контролировать.

Есть ли хорошее решение для этого, кроме установки флага или обработки операции в onContextItemSelected?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2019

Вы можете попробовать

@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, поэтому я не уверен, что любой из них будет работать.

0 голосов
/ 02 апреля 2019

Это потому, что Android использует DecorContext для действий, начинающихся в Android 27.

Вы можете увидеть это изменение здесь .

Вы можете подтвердить это в системе.уровень, глядя внутрь строки 319 в PhoneWindow .Обратите внимание, что когда PhoneWindow создается из Activity, для mUseDecorContext всегда устанавливается значение true.Это означает, что ваше меню будет создаваться с DecorContext каждый раз.

Насколько я понимаю, наличие отдельного DecorContext для ContextMenu является намеренным.ContextMenus предназначены для "плавания" над контентом и, таким образом, действуют как отдельное меню от контента, на котором они представлены.

В зависимости от того, для чего вы используете ContextMenu, вам может потребоваться рассмотретьожидая сборки Intent до onContextItemSelected, даже если вы упомянули, что хотели бы избежать этой ситуации.В качестве альтернативы вам, возможно, придется использовать некоторую форму IPC, чтобы обернуть и отправить свое намерение обратно в действие.Мы используем шаблон RxBus для этого редкого варианта использования.Альтернативные варианты: LocalBroadcastManager и EventBus от GreenRobot .Надеюсь, это поможет вам начать альтернативные решения.Дайте мне знать, если у вас есть вопросы.

0 голосов
/ 26 марта 2019

Исключение: возможно, вы не переопределили метод onContextItemSelected. Необходимо переопределить onContextItemSelected (), как показано ниже:

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

Надеюсь, это поможет вам.

...