Передача пользовательского класса в фрагмент

У меня есть пользовательский класс Data, который содержит все данные. Основное действие создает два фрагмента. У меня есть поле в основном виде:

private Data data = new Data(); 

Фрагменты создаются с помощью этого метода:

 private ArrayList<Fragment> getFragments() { ArrayList<Fragment> fragments = new ArrayList<Fragment>(); fragments.add(new fragment_one()); fragments.add(new fragment_two()); return fragments; } 

Мне нужно передать поле данных в фрагменты, поэтому фрагменты могут использовать методы Data.

Я попытался создать пакет, но я не могу передать пользовательский класс. Что я могу сделать?

Связки могут принимать пользовательские классы, если они реализуют Parcelable или Serializable , Parcelable быстрее, но больше работы для реализации, а Serializable проще реализовать, но медленнее.

Тогда вы можете это сделать:

 Bundle bundle = new Bundle(); bundle.putSerializable("MyData", data); fragment_one.setArguments(bundle); 

Теперь у fragment_one будет доступ к data в onCreate(Bundle bundleHoldingData) .

Другой вариант – иметь публичный сеттер в вашем фрагменте, который принимает данные. Воспользуйтесь этим, вам не нужно ждать, пока данные будут готовы добавить фрагмент.

Данные должны либо выполнять Parcelable, либо Serializable.

Затем вы можете использовать bundle.putParcelable () или bundle.putSerializable () для передачи данных обоим фрагментам с помощью метода setArguments ().

Вы не должны передавать ссылки на фрагменты, все ваши данные должны передаваться с помощью setArguments (если только ваш фрагмент не сохраняется). Причина в том, что андроид может уничтожить ваш фрагмент во время изменения конфигурации и воссоздать его во время создания активности.

Поэтому вы должны либо передавать свои данные внутри setArguments, либо предоставлять доступ к нему, используя singleton class, т. Е. Класс приложения.

[Править] – havent попробовал это самостоятельно, но вы можете найти онлайн-инструменты, чтобы сделать ваш класс данных более простым, вот один из них: http://devk.it/proj/parcelabler/

Вы можете установить статический объект в зависимости от того, сколько данных вы храните и осторожны с утечками памяти. Таким образом, вы можете достичь этого в фрагментах. Но сделать данные целесообразными и передать их с помощью пакета всегда лучше.

Один из вариантов – предоставить аксессуар для данных класса Activity. Затем в вашем фрагменте вы вызываете getActivity (), передаете его производному типу и получаете данные по мере необходимости.

Это, конечно, создает зависимость от вашего фрагмента к активности, но если он не предназначен для универсального, повторно используемого фрагмента, это было бы очень просто и просто реализовать и означает, что вы можете получить ссылку на текущие данные Activity и Не такая копия, как стратегия Bundle / Parcelable / Serializable.