Различия в порядке следования меню из-за фрагмента и иерархии действий. (onCreateOptionsMenu)

#android #android-activity #menu #android-fragments

#Android #android-активность #меню #android-фрагменты

Вопрос:

Предыстория

Разрабатываясь для Android 3.0, у меня есть HostActivity , который является суперклассом NotebooksActivity и NoteActivity . NotebooksActivity включает фрагмент, NotebooksFragment .

В HostActivity я включаю меню, которое я хочу отобразить в самом правом конце меню опций на панели действий, т.е. все пункты меню в подклассах HostActivity должны отображаться слева от пунктов меню, добавленных в HostActivity .

Расширение меню в HostActivity :

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    final MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.host_menu, menu);
    return super.onCreateOptionsMenu(menu);
}
  

Проблема

Когда я добавляю пункты меню в NoteActivity , я достигаю желаемого порядка, как и ожидалось:

 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.notebook_menu, menu);
    return super.onCreateOptionsMenu(menu);
}
  

Однако, когда я добавляю пункты меню в NotebooksFragment , из-за того, как работают фрагменты, onCreateOptionsMenu вызывается после того же метода в HostActivity , в результате чего пункты меню HostActivity появляются перед NotebooksFragment s.

 @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.notebooks_menu, menu);
    SearchView sv = new SearchView(getActivity());
    sv.setOnQueryTextListener(this);
    menu.findItem(R.id.search_notebooks).setActionView(sv);

    super.onCreateOptionsMenu(menu, inflater);
}
  

Как я могу добиться желаемого порядка в меню?

Ответ №1:

Вы можете попробовать использовать android:menuCategory и android:orderInCategory , чтобы более вручную указать свой порядок.

Или используйте onPrepareOptionsMenu() в HostActivity , как это называется после onCreateOptionsMenu() . Недостатком является то, что он вызывается при каждом нажатии кнопки МЕНЮ, а не только в первый раз.

Комментарии:

1. Я попробовал метод onPrepareOptionsMenu (), и он сработал. Однако по какой-то причине он вызывался дважды в моем Xoom, поэтому мне пришлось добавить немного дополнительного кода, чтобы предотвратить дублирование.

2. Я решил эту проблему, используя android:menuCategory и android:orderInCategory . Я попытался добавить пункты меню фрагмента с помощью кода, но не сработало, поэтому я был вынужден использовать меню XML: (

3. Для меня было достаточно добавить android:menuCategory="secondary" к элементам действия, которые должны появиться в конце mehu. Дополнительный атрибут упорядочения не требовался.