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(), есть ли другой способ исправить это?

Ответ 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 и помещая данные там для эквивалента "глобальных переменных"...