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

59

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

B: Должен ли я инициализировать фрагмент с фабричным шаблоном и вызвать setRetainInstance (true), дать фрагменту ключ для идентификации данных и затем позволить фрагменту получить данные, необходимые в onCreateView из какого-то третьего источника?

C: Должен ли я просто создать пустой конструктор и затем в onCreate () извлечь данные, необходимые для фрагмента?

Следует отметить, что приложение заблокировано в портретной ориентации, поэтому проблема заключается в поддержании объектов при закрытии Android и перезапуске пользователя.

Почему бы просто не создать фрагмент без заголовка и setReatinedInstance (true) и поместить тег на фрагмент, а при повторном запуске получить фрагмент с помощью тега из диспетчера фрагментов. Вы можете поместить все свои данные в фрагмент без заголовка и просто вызвать getData. это не просто! AZ_
@AZ_ кроме как мне нужен еще один фрагмент, чтобы содержать представления, означающие два фрагмента, которые только сделают код менее читабельным. Warpzit
Обработка изменений во время выполненияdeveloper.android.com/guide/topics/resources/… AZ_
Я думаю, что это сделает ваш код более надежным. Просто объявите внутренний безголовый фрагмент setRetainedInstance (true), и вы также можете использовать его в качестве фонового рабочего потока, это рекомендуемое решение Google. Я читаю где-то в developer.android.com AZ_
@AZ_ Да, но обработка потока и обработка данных - это две разные вещи. Если бы у меня была какая-то многопоточность для обработки, я бы с вами согласился, но если это просто необработанные данные, то подходил бы заводской шаблон. Это то же самое, что делает Google в соответствии с собственной документацией:developer.android.com/guide/components/fragments.html Warpzit

Ваш Ответ

1   ответ
72

So what would be a good way to start new fragments with a list of data.

Используйте шаблон фабрики и аргументы & quot; аргументы & quot;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));
  }
}

Если вы сохраняете свой экземпляр фрагмента, вы можете использовать обычные сеттеры для добавления элементов в члены данных. & Quot; аргументы & quot;Bundle сохраняется как часть изменений конфигурации, поэтому для неподдерживаемых экземпляров это способ обеспечить сохранение ваших данных настройки, если пользователь поворачивает экран и т. д.

Error: User Rate Limit ExceededallError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededsetRetainInstance()Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededContentProviderError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы