Сохранение состояния фрагментов навигационного ящика

Я пытаюсь сохранить состояние фрагментов навигационного ящика, когда переключаюсь между различными фрагментами в навигационном ящике. Например: я начинаю с фрагмента A, запуская некоторые события, затем переключаюсь на фрагмент B. Затем я хочу видеть то же состояние фрагмента A, когда я переключаюсь обратно на фрагмент A из фрагмента B.

Я попытался использовать onSavedInstanceState (Bundle saveInstanceState), но он вызывается только при изменении ориентации в жизненном цикле фрагмента. Каждый раз, когда я переключаюсь на новый фрагмент, создается новый фрагмент, и я не могу понять, как сохранить данные из фрагмента и перезагрузить их при следующем посещении.

Я также не хочу использовать backstack(), потому что он удаляет все фрагменты вплоть до фрагмента, который я хочу восстановить.

Ниже показано, как я вызываю фрагменты на переключателе ящика.

private void selectItem(int position) {

    Fragment fragment;
    String TAG;

    switch (position) {
    case 0:
        fragment = new FragmntA();
        TAG = "A";
        break;
    case 1:
        fragment = new FragmentB();
        TAG = "B";
        break;
    case 2:
        fragment = new FragmentC();
        TAG = "C";
        break;
    case 3:
        fragment = new FragmentD();
        TAG = "D";
        break;
    case 4:
        fragment = new FragmentE();
        TAG = "E";
        break;
    default:
        fragment = new FragmentA();
        TAG = "A";
    }

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.replace(R.id.content_frame, fragment, TAG);
    ft.commit()

Я не знаю, есть ли какая-то точка в жизненном цикле фрагмента, где я могу сохранить его состояние. Любая помощь будет оценена по достоинству. Спасибо.


person TeddyG    schedule 14.04.2014    source источник
comment
Вместо того, чтобы каждый раз создавать новый фрагмент, создавайте только один из них, повторно используя один и тот же экземпляр FragmentA, B, C и т. д., возможно, также в сочетании с setRetainInstance(true) для фрагментов.   -  person cYrixmorten    schedule 14.04.2014


Ответы (2)


Чтобы не потерять состояние ваших фрагментов при переключении с одного на другой, вы должны сделать "new Fragment()" только один раз и сохранить экземпляр в глобальной переменной.

Но это не решит проблему вращения. Для проблемы ротации вы должны прочитать это => http://blog.sqisland.com/2014/06/navigationdrawer-creates-fragment-twice.html Непросто, но другого способа пока не нашел.

person davgut    schedule 05.09.2014

определите объект фрагмента как статический в классе, а в методе newInstance инициализируйте только фрагмент, если он равен нулю, иначе просто верните фрагмент.

Это решит вашу проблему.

но для изменения ориентации вам придется использовать метод saveinstancestate.

person Mayur Kulkarni    schedule 02.12.2014
comment
Использовать статические поля — плохая практика! - person Sufian; 12.12.2014