Android ListFragment не сохраняет пакет в onSaveInstanceState () / не получает пакет в onActivityCreated () - PullRequest
13 голосов
/ 27 июля 2011

Я новичок в 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() по-прежнему равен нулю.

Вот код:

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);
    }
}

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

Ответы [ 3 ]

7 голосов
/ 28 декабря 2011

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

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

3 голосов
/ 17 января 2012

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

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

2 голосов
/ 16 сентября 2011

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

...