SavedInstanceState при восстановлении фрагмента из заднего стека
Можно ли использовать savedInstanceState()
для сохранения состояния при удалении фрагмента, а затем восстановить состояние, когда я вытащил фрагмент из заднего стека? Когда я восстанавливаю фрагмент из заднего стека, пакет savedInstanceState всегда имеет значение null.
В настоящий момент поток приложений: созданный фрагмент → удаленный фрагмент (добавлен в задний стек) → восстановлен фрагмент из заднего стека (пакет savedInstanceState равен null).
Вот соответствующий код:
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
Long playlistId = bundle.getLong(Constants.PLAYLIST_ID);
int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID);
if (savedInstanceState == null) {
selectedVideoNumber = playlistItemId;
} else {
selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO");
}
}
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber);
}
Я думаю, проблема в том, что onSavedInstanceState()
никогда не вызывается при удалении и добавлении в задний стек. Если я не могу использовать onsavedInstanceState(), есть ли другой способ исправить это?
Ответы
Ответ 1
onSaveInstanceState (к сожалению) не вызывается при нормальном повторном создании фрагмента. Проверьте http://developer.android.com/guide/components/fragments.html#Creating и ответ на Как сохранить состояние фрагмента при добавлении на задний план стек?
Ответ 2
Мне нравится сохранять представление я в onCreateView как глобальную переменную, а затем, когда я возвращаюсь, я просто проверяю это:
if(mBaseView != null) {
// Remove the view from the parent
((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
// Return it
return mBaseView;
}
Ответ 3
Проблема заключается в том, что фрагмент должен иметь связанный с ним Id
или Tag
, чтобы FragmentManager
отслеживал его.
Существует как минимум 3 способа сделать это:
-
В макете xml объявите Id
для вашего фрагмента:
android:[email protected]+id/<Id>
-
Если ваш контейнер фрагментов View
имеет Id
, используйте FragmentTransaction:
FragmentTransaction add (int containerViewId, Fragment fragment)
-
Если ваш фрагмент не связан с каким-либо View
(например, безголовым фрагментом), дайте ему Tag
:
FragmentTransaction add (Fragment fragment, String tag)
Также см. этот ответ SO.
Ответ 4
FWIW, я тоже это ударил, но в моем случае onSaveInstanceState был вызван правильно, и я ввел данные своего состояния, когда на смартфон был взят новый фрагмент активности. То же, что и вы, onActivityCreated был вызван w/savedInstanceState всегда null. ИМХО, я думаю, что это ошибка.
Я работал вокруг него, создавая статическое состояние MyApplication и помещая данные там для эквивалента "глобальных переменных"...