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">