Intereting Posts
Разрешение базы данных Firebase запрещено с разрешениями на чтение / запись, установленными в true ImageView с высотой wrap_content показывает очень тощую / обрезанную фотографию вместо полной высоты Android VideoView Невозможно воспроизвести видеообнаружение, особенно .mp4 Возобновить работу на Android Разница между контекстным меню и меню опций в android ListView, BaseAdapter, getViewTypeCount () – Как заставить адаптер снова проверить getViewTypeCount ()? Не удалось загрузить модуль memtrack (нет такого файла или каталога) Как я могу скрыть страницу / ошибку «Веб-страница недоступна» из веб-представления? Фильтрация фильтра ArrayAdapter, показывающая неправильные элементы Android: изменение размера предварительного просмотра камеры на экране Как использовать ADB для отправки сенсорных событий на устройство с помощью команды sendevent? Android – Как опубликовать рейтинг приложения / комментарии на Market из приложения? Gradle в Android Studio: не удалось разрешить сторонние библиотеки Android: Почему я не могу переопределить setFrame из представления? Может ли приложение, созданное Android Studio, быть отправлено в Google Play Store?

Почему не вызываются мои фрагменты onSaveInstanceState ()?

У меня есть фрагмент, который имеет собственное состояние (выбранные кнопки и т. Д.). Это состояние теряется при вращении экрана.

Активность, содержащая фрагмент, имеет портретную компоновку в / res / layout / и почти идентичную компоновку ландшафта в / res / layout-land /. Оба макета включают фрагмент следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:id="@+id/testFragment" android:layout_width="fill_parent" android:layout_height="wrap_content" class="au.com.xyTestFragment" /> ...</LinearLayout> 

Класс фрагмента, который я тестировал:

 public class TestFragment extends android.support.v4.app.Fragment { private static final String TAG = "TestFragment"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate(): " + (savedInstanceState != null ? "NOT NULL" : "NULL")); } public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.i(TAG, "onActivityCreated(): " + (savedInstanceState != null ? "NOT NULL" : "NULL")); } public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); Log.i(TAG, "onSaveInstanceState()"); state.putString("saved_thing", "some_value"); } public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle b) { ... } } 

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

LogCat дает мне:

 BEFORE SCREEN ROTATION (PORTRAIT): 02-23 11:45:58.015: I/TestFragment(22629): onCreate(): NULL 02-23 11:45:58.015: I/TestFragment(22629): onCreateView() 02-23 11:45:58.035: I/TestFragment(22629): onActivityCreated(): NULL AFTER SCREEN ROTATION (LANDSCAPE): 02-23 11:46:00.615: I/TestFragment(22629): onCreate(): NULL 02-23 11:46:00.615: I/TestFragment(22629): onCreateView() 02-23 11:46:00.635: I/TestFragment(22629): onActivityCreated(): NULL 

Как вы можете видеть, onSaveInstanceState() никогда не вызывается, и фрагмент всегда получает null savedInstanceState , как в onCreate() и onActivityCreated() .

Я пробовал myFragment.setRetainInstance(true) в своих действиях onCreate() , но это ничего не изменило.

У моего onSaveInstanceState() есть @Override, поэтому я знаю, что это не что-то глупое, как опечатка.

Я рассмотрел один из примеров ActionBarSherlock (com.actionbarsherlock.sample.shakespeare), а фрагменты, которые их onSaveInstanceState() вызвали правильно. Насколько я могу судить, этот пример написан точно, как мой код – фрагменты, включенные как в макет, так и в XML-формат. Я даже построил этот образец, используя ту же версию ActionBarSherlock, что и мой основной проект, и сохранение состояния экземпляра отлично подходит для этого примера.

Как сохранить состояние фрагментов во время вращения экрана? Почему не onSaveInstanceState() ?

Вы можете включить myFragment.setRetainInstance(true) чтобы сохранить состояние, но оно делает это «автоматически», то есть оно сохраняет значения, назначенные вашим членам класса, и НЕ использует onSaveInstanceState (и, следовательно, savedInstanceState всегда имеет значение null).

Убедитесь, что FragmentActivity который размещает этот фрагмент, не переопределяет onSaveInstanceState или когда он это делает, он должен вызвать super.onSaveInstanceState(Bundle) .

Если фрагмент нуждается в другом ресурсе макета при его повороте, setRetainInstance(true) не может быть использован. На этой странице показан жизненный цикл фрагмента с помощью setRetainInstance(true) .

Исходной идеей является использование onSaveInstanceState() для сохранения всех данных участников, как и обычный Activity. Однако по какой-то причине onSaveInstanceState() не вызван. Но FragmentActivity верна, как предложил @ Эрик Кок). Лучшее решение, которое я нашел, – использовать Аргументы Фрагмента.

См. Решение Федора Волчёка , это просто. Просто работайте так, как будто outState в onSaveInstanceState () и savedInstanceState в onViewCreated ().