Android-фрагмент предпочтения таинственным образом вызывается дважды

При первом запуске моего приложения для Android я вызываю фрагмент предпочтений, потому что пользователю нужно сначала сделать выбор из списка элементов, и их выбор необходимо сохранить. Я расширяю ListPreference для отображения списка элементов.

Как это должно работать, пользователь выбирает элемент из представленного списка. Этот выбор сохраняется в SharedPreferences, и приложение переходит к другому фрагменту. Все это работает, но по какой-то причине ListPrefence отображается во второй раз.

Я внес некоторые записи в журнал и обнаружил, что по какой-то причине создаются два объекта ListPreference... но я знаю только один вызов для его создания. Мне почему-то не хватает, где/почему конструктор ListPreference вызывается во второй раз.

Мой код PreferenceFragment прост. Это выглядит как

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.i("INIT", "ONCREATE");
  addPreferencesFromResource(R.xml.inititems); // load from XML

Есть только вызов addPreferencesFromResource(). Никакое другое место в моем коде фрагмента не должно (насколько я понимаю) вызывать создание экземпляра ListPreference, но ведение журнала говорит мне, что конструктор ListPreference вызывается дважды, а onCreate фрагмента вызывается только один раз.

Я собираюсь попытаться выполнить трассировку стека из конструктора ListPreference, но я хотел узнать, есть ли у кого-нибудь мысли или предложения помимо трассировки стека. Почему конструктор вызывается дважды?

Спасибо! -март


person Marlonez    schedule 01.01.2015    source источник
comment
Вы поворачиваете ориентацию экрана? Когда вы делаете это, вызывается метод OnCreate.   -  person Trebia Project.    schedule 02.01.2015
comment
Привет Требия. Нет, никаких изменений в ориентации.   -  person Marlonez    schedule 02.01.2015
comment
Это, вероятно, связано с жизненным циклом активности. Не могли бы вы описать точные шаги, которые вы выполняете, чтобы получить двойной вызов метода OnCreate?   -  person Trebia Project.    schedule 02.01.2015
comment
В onCreate из mainActivity() я вызываю фрагмент, используя этот getFragmentManager().beginTransaction() .add(R.id.container, new InitAFragment(), "InitAFragment").commit();, затем в onCreate фрагмента я вызываю addPreferencesFromResource(R.xml.inititems)   -  person Marlonez    schedule 04.01.2015
comment
Я пытался сказать, шаги, которые вы выполняете на своем устройстве   -  person Trebia Project.    schedule 05.01.2015
comment
Привет и спасибо за продолжение. Я использовал трассировку стека, чтобы выяснить проблему. В onCreate() основного действия я вызываю PreferenceManager.setDefaultValues(context, R.xml.references, false). Поскольку R.xml.references создает экземпляр ListPreference, именно отсюда берется второй экземпляр ListPreference.   -  person Marlonez    schedule 05.01.2015


Ответы (1)


Возможно, вы сослались на фрагмент в файле ресурсов макета, используя android:name="yourfragment", а также во время выполнения в onCreate(). Это приведет к тому, что он будет загружен дважды.

person user3615720    schedule 17.12.2018