Использование onSaveInstanceState с фрагментами в backstack?
У меня есть фрагменты, которые я храню в backscack FragmentManager. Каждое состояние фрагмента сохраняется для изменений ориентации с переменными-членами, например, это:
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putLong("userId", mUserId);
outState.putString("username", mUsername);
}
Моя проблема в том, что если есть изменение ориентации, так как каждый фрагмент в backstack вызывается через onSaveInstanceState, я получаю исключение нулевого указателя, потому что переменные-члены больше не существуют.
Любые идеи о том, как это решить?
Ответы
Ответ 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
(в этом специальном случае, когда фрагмент находится в задней части).