Intereting Posts
Виртуальное устройство, работающее в Genymotion, периодически выходит в автономный режим в ADB Возвращает ли Fragment.getArguments () аргументы после изменения конфигурации? Попытка использовать голографическую тему в Android не работает OnDestroy вызывается каждый раз, когда экран продолжается Разница между Phonegap и Sencha Touch Борьба за понимание обработки исключений Xamarin Eclipse, два разных файла с одинаковым именем в разных каталогах Слушатель для просмотра виджета ViewFlipper Установите (и обновите) приложение для Android с моего собственного сайта, а не на рынок Как использовать живое видео в качестве фона активности? Маржа между заголовками X-Axis и ярлыками X-Axis в AChartEngine Android Market – единственные отчеты о сбоях, которые я получаю, находятся на платформах «OTHER» Android mock location на устройстве? Запись файла .json и чтение этого файла на Android Экран входа в систему Android Facebook без клавиатуры

Изменение состояния меню панели действий в зависимости от фрагмента

Я пытаюсь показать / скрыть элементы в моей панели действий в зависимости от того, какой фрагмент виден.

В моей MainActivity у меня есть следующее

/* Called whenever invalidateOptionsMenu() is called */ @Override public boolean onPrepareOptionsMenu(Menu menu) { if(this.myFragment.isVisible()){ menu.findItem(R.id.action_read).setVisible(true); }else{ menu.findItem(R.id.action_read).setVisible(false); } return super.onPrepareOptionsMenu(menu); } 

Это прекрасно работает, однако, когда устройство повернуто, возникает проблема. После того, как ротация завершена onPrepareOptionsMenu вызывается снова, но на этот раз this.myFragment.isVisible () возвращает false … и, следовательно, элемент меню скрыт, когда ясно, что фрагмент виден (насколько показано на экране).

Solutions Collecting From Web of "Изменение состояния меню панели действий в зависимости от фрагмента"

Изменить: это быстрое и грязное исправление, см. Ниже приведенный ниже ответ es0329 для лучшего решения.

Попробуйте добавить этот атрибут в свой тег activity в манифест андроида:

 android:configChanges="orientation|screenSize" 

Основываясь на Руководстве API фрагментов , мы можем добавлять элементы в панель действий на основе каждого фрагмента со следующими шагами: Создайте res/menu/fooFragmentMenu.xml , содержащий пункты меню, как обычно для стандартного меню.

 <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/newAction" android:orderInCategory="1" android:showAsAction="always" android:title="@string/newActionTitle" android:icon="@drawable/newActionIcon"/> </menu> 

В начало метода FooFragment onCreate укажите, что у него есть свои собственные пункты меню для добавления.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); ... } 

Переопределите onCreateOptionsMenu, где вы раздуваете меню фрагмента и присоединяете его к своему стандартному меню.

 @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fooFragmentMenu, menu); super.onCreateOptionsMenu(menu, inflater); } 

Переопределить onOptionItemSelected в вашем фрагменте, который вызывается только тогда, когда тот же самый метод действия Activity Activity / FragmentActivity видит, что он не имеет случая для выбора.

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.newAction: ... break; } return super.onOptionsItemSelected(item); } 

Попробуйте использовать Fragment setRetainInstance(true); Когда ваш фрагмент прикреплен к Activity. Таким образом, ваш фрагмент сохранит текущие значения и вызовет жизненный цикл при повороте устройства.