SavedInstanceState всегда имеет нулевой фрагмент
У меня есть фрагмент, прикрепленный к активности с использованием XML (и setContentView() в действии). У меня проблема, потому что у меня очень динамические представления в моем фрагменте, поэтому при изменении ориентации
Я должен восстановить все состояния взглядов.
У меня проблема, потому что я использую что-то вроде этого:
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("restore", true);
outState.putInt("nAndroids", 2);
}
Но после изменения ориентации, когда вызываются методы с param Bundle savedInstanceState (например, onCreateView и т.д.), my savedInstanceState всегда имеет значение null.
Я не noob в Android, но теперь я очень злюсь из-за этой проблемы...
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState == null) {
//smth
} else {
// smthelse THIS IS NEVER REACHED BECAUSE BUNDLE IS ALWAYS NULL
}
getListView().setDivider(getResources().getDrawable(R.drawable.list_divider));
}
Ответы
Ответ 1
Вся проблема в том, что я не объявляю android: id для фрагмента в XML. Android требует ID или TAG для распознавания сохраненного фрагмента и воспроизведения всех элементов в нем. Итак, ребята, помните - каждому экземпляру фрагмента нужен уникальный идентификатор или тег!
Кроме того, если объявлено setRetainInstance (true), то пакет всегда должен возвращать null.
Ответ 2
У меня была аналогичная проблема, когда я всегда получал savedInstanceState как нуль, несмотря на то, что он поставлял пакет в Фрагмент.
Единственное решение, которое сработало для меня, заключалось в том, чтобы сделать
myFragment.setArguments(bundle)
с моим пакетом из Activity и do
Bundle bundle = this.getArguments();
в onCreateView фрагмента.
Надеюсь, это поможет кому-то еще.
Ответ 3
Для фрагмента: -
use this for save state of fragment on orientation.
onCreate(Bundle save)
{
super.onCreate(save);
setRetainInstance(true);
}
См. этот учебник: -
http://techbandhu.wordpress.com/2013/07/02/android-headless-fragment/
Для деятельности: -
Когда вы запускаете свое приложение, в onCreate
, ваш объект пакета имеет значение NULL, поэтому вам нужно поставить чек, как показано ниже, и когда вы поворачиваете экран, тогда вызывается onSaveInstance
, и ваш объект пакета инициализируется
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
if (savedInstanceState != null) {
boolean t = outState.getBoolean("restore");
int s = outState.getInt("nAndroids");
}
}
Ответ 4
Хорошо, я знаю, что это старый пост, но я не мог найти правильный ответ для меня здесь и многих других мест, поэтому я публикую, как я исправил свой случай.
Итак, мой фрагмент находится внутри Activity. И я изначально пытался сохранить Bundle только во Фрагменте и получить его на onCreateView. Однако это была проблема.
Я исправил это, инициировав объект myFragment в активности и поместив этот объект в Activity Bundle на onSaveInstanceState(). Затем извлекли его на onRestoreInstanceState(). Я использовал getSupportFragmentManager(). PutFragment/getFragment. Затем сохраненное значениеInstanceState в фрагменте больше не равно null.
Ответ 5
Сначала вы должны поместить свои данные, затем вызовите super.onSaveInstanceState(outState);
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean("restore", true);
outState.putInt("nAndroids", 2);
super.onSaveInstanceState(outState);
}
И убедитесь, что в объекте nohistory
у объекта нет значения nohistory
или установите его false.
<activity
android:noHistory="false">