Правильный способ дать начальные данные фрагментам?
Итак, я узнал, что мне нужен пустой конструктор, чтобы мои фрагменты не врезались при повторной инициализации. Моя проблема заключается в том, что я использую списки данных для моего фрагментов, когда они инициализируются (по крайней мере некоторые из них). Итак, что было бы хорошим способом начать новые фрагменты со списка данных. Должен ли я в 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: я должен инициализировать фрагмент с пустым конструктором, а затем из моей деятельности использовать сеттеры для установки данных непосредственно в фрагменте? Однако, не буду ли я пропускать данные, если пользователь нажимает home, android закрывает фрагмент и пользователь позже возвращается?
B: должен ли я инициализировать фрагмент с заводским шаблоном и вызвать setRetainInstance(true), дать фрагменту ключ для идентификации данных, а затем позволить фрагменту получить данные, необходимые в onCreateView из какого-либо третьего источника?
C: я должен просто сделать пустой конструктор и затем в onCreate() извлеките данные, необходимые для фрагмента?
следует отметить, что приложение заблокировано в портрете, так что проблема в первую очередь с поддержанием объектов, когда Android закрывается и пользователь перезагружается.
1 ответ:
Итак, что было бы хорошим способом начать новые фрагменты со списком данных.
используйте заводской шаблон и" аргументы"
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
сохраняется как часть изменений конфигурации, поэтому для не сохраненных экземпляров это способ убедиться, что ваши данные установки сохраняется, если пользователь поворачивает экран, и т. д.