Intereting Posts
Использование SVG-файлов с libgdx Опубликовать данные с помощью пользовательских вкладок Chrome Возможность кликабельного соединения, извлекаемого в EditText, который отображает вид на клике Настройка SDL2 на Windows Android Android Facebook SDK: Key hash не соответствует сохраненным хэшам при загрузке google play Как отобразить PDF через веб-браузер Android без «загрузки» в первую очередь Android: используйте обычный текст, используя намерение (для всех приложений для обмена сообщениями) Как форматировать longs в android для отображения двух цифр Установка пользовательского шрифта (TypeFace) в диалоговом окне на Android Как получить Bitmap из MapView с Android API Google Maps V2 Изменить размер Android-Seekbar? Повторная установка броска исключения IllegalArgumentException для асинхронного вызова DELETE FormUrlEncoded Как приостановить / скрыть поток или процесс в Android? Как я могу сохранить растровое изображение с onRetainNonConfigurationInstance () для ориентации экрана? SQLite onUpgrade ()

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

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

В моей 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 … и, следовательно, элемент меню скрыт, когда ясно, что фрагмент виден (насколько показано на экране).

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