Подтвердить что ты не робот

Использование onSaveInstanceState с фрагментами в backstack?

У меня есть фрагменты, которые я храню в backscack FragmentManager. Каждое состояние фрагмента сохраняется для изменений ориентации с переменными-членами, например, это:

@Override
public void onSaveInstanceState(Bundle outState) 
{
    super.onSaveInstanceState(outState);
    outState.putLong("userId", mUserId);
    outState.putString("username", mUsername);
}

Моя проблема в том, что если есть изменение ориентации, так как каждый фрагмент в backstack вызывается через onSaveInstanceState, я получаю исключение нулевого указателя, потому что переменные-члены больше не существуют.

Любые идеи о том, как это решить?

4b9b3361

Ответ 1

Возможно, что ваши переменные-члены больше не существуют, потому что FragmentManager в вашем Activity умирает со всеми вашими фрагментами.

Вам нужно переопределить метод onSaveInstanceState вашего класса Activity, потому что вам нужно сохранить состояние Activity, прежде чем сохранять состояние Fragments.

В документации говорится:

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

UPDATE

В ваших Activity onSaveInstanceState и onRestoreInstanceState попробуйте сохранить ссылки Fragment, а затем восстановите их примерно так:

public void onSaveInstanceState(Bundle outState){
    getFragmentManager().putFragment(outState,"myfragment",myfragment);
}
public void onRestoreInstanceState(Bundle inState){
    myFragment = getFragmentManager().getFragment(inState,"myfragment");
}

Скажи мне, если тебе повезло!: -)

Ответ 2

Основываясь на Хорхе Гиле - "xɔɾ.xɛ xil" Обратите внимание на следующее:

  • Не забудьте вызвать суперверсии onSaveInstanceState() и onRestoreInstanceState().
  • Если вы используете пакет поддержки: используйте getSupportFragmentManager() вместо getFragmentManager().
  • При получении исходного фрагмента вы должны его бросить.

Извините за то, что я капитан!

Ответ 3

Помогает ли установка setRetainInstance в помощи фрагмента. попробуйте

Ответ 4

Я думаю, что правильное решение состоит в том, чтобы прочитать эти переменные-члены из savedInstanceState в onCreate, которые, кажется, всегда вызываются до onSaveInstanceState. Если вы обрабатываете поля в onViewCreated, у них нет возможности получить инициализацию до следующего onSaveInstanceState (в этом специальном случае, когда фрагмент находится в задней части).