Пустой пакет savedInstanceState при восстановлении фрагмента после двойного поворота при замене фрагмента

Давайте назовем их фрагментом A и B. Фрагмент B - это просто подробное представление для A, которое заменяет фрагмент A при нажатии кнопки во фрагменте A.

Код замены:

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new DetailFragment());
    transaction.addToBackStack(null);
    transaction.commit();

Когда я теперь поверну экран во фрагменте B один раз и нажму «Назад», старый фрагмент A будет восстановлен без каких-либо проблем (он восстанавливает его состояние в onActivityCreated с помощью пакета savedInstanceState).

А теперь самое интересное ...

Когда я поворачиваю экран во фрагменте B более одного раза и нажимаю Back, я получаю исключение NullPointerException, потому что int[] data = savedInstanceState.getIntArray(STATE_DATA); в onActivityCreated возвращает null.

Как я могу исправить такое поведение? Единственный другой способ, который я использовал, - это постоянное хранилище (предпочтение или БД), но это кажется очень неподходящим для варианта использования.

редактировать / дополнительная информация: сам пакет не является нулевым, он просто пуст


person algorithms    schedule 18.09.2014    source источник


Ответы (1)


Хорошо, я нашел ответ:

Следующие методы из фрагмента A вызываются при изменении поворота, пока фрагмент B активен: onSaveInstanceState (), onAttach () и onCreate ()

поскольку я восстанавливаю свое состояние в onActivityCreated (что на самом деле рекомендуется sdk!), я теряю свои переменные, хранящиеся в пакете, после первой ротации, потому что они никогда не загружаются в локальные переменные, которые затем будут сохранены в следующем onSaveInstanceState. Поэтому эти значения равны нулю, когда я пытаюсь получить их после второго поворота.

Решение: восстановите переменные в onCreate (), чтобы они были доступны при повторном вызове onSaveInstanceState.

person algorithms    schedule 18.09.2014