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

Android ListFragment не сохраняет пакет в onSaveInstanceState()/не извлекает пакет в onActivityCreated()

Я новичок в Android, и я столкнулся со следующей проблемой. Я развиваюсь как для Android, так и для Android 2 и 3, и именно поэтому я использую фрагменты. Однако чтобы приложение работало на устройствах Android 2, я импортирую файл android.support.v4.app.ListFragment. Мне нужно сохранить выбор в моем ListFragment, когда ориентация экрана меняется. Я переопределяю метод onSaveInstanceState() и помещаю int в пакет. Когда экран вращается, этот метод вызывается, и int добавляется к набору. Однако, когда вызывается onActivityCreated(), его пучок равен нулю. Я следую примеру, представленному на веб-сайте Android: http://developer.android.com/reference/android/app/Fragment.html, но, как упоминалось выше, после вызова onSaveInstanceState() пакет в onActivityCreated() все равно null.

Здесь код:

import android.support.v4.app.ListFragment;
public class VisitsHomeFragment extends ListFragment {
    private int selectedPosition = -1;  

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
          if (savedInstanceState.containsKey("SELECTED_POSITION")) {
                selectedPosition = savedInstanceState.getInt("SELECTED_POSITION");
          }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("SELECTED_POSITION", selectedPosition);
    }
}

Буду признателен за любую помощь в решении этой проблемы.

4b9b3361

Ответ 1

У меня была та же проблема, добавив android:id в элемент фрагмента в файле макета, исправил эту проблему.

Кажется, что FragmentManager использует id для отправки соответствующего пакета при воссоздании фрагмента.

Ответ 2

Убедитесь, что вы не вызываете setRetainInstance(true) в Fragment. После небольшого эксперимента я указал на это как на ошибку в моем коде. Недостатком этого является то, что нужно вручную объединить все данные экземпляра.

После удаления вызова метода и обновления моего onSaveInstanceState для посылки всех моих переменных экземпляра теперь я могу восстановить положение списка при вращении.

Ответ 3

У меня была та же проблема, и я в конечном итоге отследил ее, чтобы иметь разные значения атрибута android: id для элементов фрагмента в двух разных макетах (портрет и пейзаж).