Подтвердить что ты не робот

Правильный способ предоставления исходных данных фрагментам?

Итак, я узнал, что мне нужен пустой конструктор, чтобы мои фрагменты не рушились при повторной инициализации. Моя проблема в том, что я использую списки данных для своих фрагментов, когда они инициализируются (по крайней мере, некоторые из них). Итак, что будет хорошим способом запускать новые фрагменты со списком данных. Должен ли я в 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 закрывается и пользователь перезагружается.

4b9b3361

Ответ 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 сохраняются как часть изменений конфигурации, поэтому для не-сохраненных экземпляров это способ обеспечить сохранение ваших данных настройки, если пользователь поворачивает экран и т.д.