#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. Дополнительный атрибут упорядочения не требовался.