В настоящее время я пытаюсь адаптировать приложение для использования "Библиотеки совместимости для Android v4", чтобы обеспечить преимущества использования фрагментов даже пользователям Android 1.6.
Реализация контекстного меню кажется сложной:
- Основная деятельность приложения расширяет FragmentActivity класс.
- Все фрагменты основаны на одном класс, который расширяет класс фрагмента.
- Класс фрагмента вызывает вызов registerForContextMenu() в своем методе onCreateView() и переопределяет методы onCreateContextMenu() и onContextItemSelected().
Для onCreateContextMenu() это работает очень хорошо. Контекстное меню завышено из файла ресурсов и слегка изменено на основе выбранного элемента (который основан на listView... даже если фрагмент не является списком).
Проблема возникает, когда выбрана запись в контекстном меню. onContextItemSelected() вызывается для всех существующих в настоящее время фрагментов, начиная с первого добавленного.
В моем случае фрагменты используются для отображения содержимого структуры папок. Когда контекстное меню фрагмента вложенной папки открывается и выбирается пункт меню, onContextItemSelected() сначала вызывается на верхних уровнях (в зависимости от того, сколько фрагментов разрешено/видимо в данный момент).
В настоящее время я использую обходное решение для поля на уровне активности, которое содержит тег последнего фрагмента, вызывающий его onCreateContextMenu(). Таким образом, я могу вызвать "return super.onContextItemSelected(item)" в начале onContextItemSelected(), когда сохраненный тег не совпадает с getTag(). Но этот подход выглядит немного грязным для меня.
Почему onContextItemSelected() вызывается для всех фрагментов? а не только тот, который вызывал onCreateContextMenu()?
Каков самый элегантный способ справиться с этим?