Правильный способ предоставления исходных данных фрагментам?
Итак, я узнал, что мне нужен пустой конструктор, чтобы мои фрагменты не рушились при повторной инициализации. Моя проблема в том, что я использую списки данных для своих фрагментов, когда они инициализируются (по крайней мере, некоторые из них). Итак, что будет хорошим способом запускать новые фрагменты со списком данных. Должен ли я в OnCreate() создать метод getData, который получает данные из какого-то другого источника или что будет правильным?
Подача пакета с данными действительно не была бы очень хорошим подходом, так как у меня много данных.
Итак, давайте возьмем случай (я так понимаю, что это лучше).
Когда пользователь нажимает на кнопку, фрагмент запускается. То, что я делал, это создать новый фрагмент следующим образом:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
fragmentTransaction.addToBackStack(DETAIL_TAG);
fragmentTransaction.commit();
Затем в моем фрагменте:
public DetailFragment(EventItem item) {
mItem = item;
mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}
Я не могу передать все данные в пакет, так что это не сработает. Итак, что мне делать?
A: Должен ли я инициализировать фрагмент с помощью пустого конструктора, а затем из моей настройки использования активности для установки данных непосредственно в фрагменте? Однако, не будет ли я отсутствовать данные, если пользователь нажимает на дом, андроид закрывает фрагмент и пользователь позже возвращается?
B: Должен ли я инициализировать фрагмент с помощью шаблона factory и вызвать setRetainInstance (true), предоставить фрагменту ключ для идентификации данных, а затем позволить фрагменту извлечь данные, необходимые в onCreateView, из какого-то третьего источника?
C: Должен ли я просто создать пустой конструктор, а затем в onCreate() извлечь данные, необходимые для фрагмента?
Следует отметить, что приложение заблокировано в портрете, поэтому проблема связана, прежде всего, с сохранением объектов, когда Android закрывается и пользователь перезагружается.
Ответы
Ответ 1
Итак, что будет хорошим способом запускать новые фрагменты со списком данных.
Используйте шаблон factory и "аргументы" Bundle
, например:
package com.commonsware.empublite;
import android.os.Bundle;
public class SimpleContentFragment extends AbstractContentFragment {
private static final String KEY_FILE="file";
protected static SimpleContentFragment newInstance(String file) {
SimpleContentFragment f=new SimpleContentFragment();
Bundle args=new Bundle();
args.putString(KEY_FILE, file);
f.setArguments(args);
return(f);
}
@Override
String getPage() {
return(getArguments().getString(KEY_FILE));
}
}
Если вы сохраняете экземпляр фрагмента, вы должны уйти от него, просто используя обычные сеттеры, чтобы помещать материал в члены данных. "Аргументы" Bundle
сохраняются как часть изменений конфигурации, поэтому для не-сохраненных экземпляров это способ обеспечить сохранение ваших данных настройки, если пользователь поворачивает экран и т.д.