Intereting Posts
Android 1.x Contacts.Extensions для пользовательского типа учетной записи? Невозможно нажать на элементы в ListView с помощью настраиваемого адаптера Исправление исключений CursorLoader Размеры видоискателя Android NoClassDefFoundError во время выполнения, но класс находится в классах.dex, какие даны? IntentService и AlarmManager Как настроить Android (ADT-Plugin) для Eclipse? Как преобразовать существующее веб-приложение Angular1 в приложение Cordova? Добавление дочернего элемента в родительский элемент на кнопке Нажмите Xamarin.forms Почему размер видеоизображения изменился автоматически в зависимости от размера видео? Не удалось распознать мое устройство Android на mac Может ли сборка из одного исходного кода выводить функционально разные исполняемые файлы? Как издеваться над тегом Android NFC для модульного тестирования Динамическое добавление представлений в цикле for приводит к беспорядочному позиционированию – Android Автомасштабирование

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

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

В моей 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. Таким образом, ваш фрагмент сохранит текущие значения и вызовет жизненный цикл при повороте устройства.