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


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

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