Właściwy sposób przekazywania początkowych danych fragmentom?

Więc nauczyłem się, że potrzebuję pustego konstruktora, aby moje fragmenty nie rozbiły się podczas reinicjalizacji. Mój problem polega na tym, że używam list danych dla moich fragmentów, gdy są inicjalizowane (przynajmniej niektóre z nich). Więc co byłoby dobrym sposobem, aby rozpocząć nowe fragmenty z listy danych. Czy powinienem w OnCreate() zrobić metodę getData, która pobiera dane z jakiegoś innego źródła lub jakie byłoby właściwe podejście?

Podawanie pakietu danych naprawdę nie byłoby zbyt dobre podejście, ponieważ mam dużo danych.

Więc weźmy sprawę (rozumiem to lepiej w ten sposób).

Gdy użytkownik kliknie przycisk, fragment jest uruchamiany. Kiedyś tworzyłem nowy fragment w ten sposób:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
    fragmentTransaction.addToBackStack(DETAIL_TAG);

    fragmentTransaction.commit();

Potem w moim fragmencie:

public DetailFragment(EventItem item) {
    mItem = item;
    mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}
Nie mogę dać wszystkich danych do paczki, więc to by nie zadziałało. Więc co mam zrobić?

A: czy powinienem zainicjować fragment pustym konstruktorem, a następnie z mojej aktywności użyć setterów do Ustawienia danych bezpośrednio we fragmencie? Czy jednak nie zabraknie mi danych, jeśli użytkownik naciśnie home, android zamknie fragment, a użytkownik wróci później?

B: Czy powinienem zainicjować fragment wzorcem fabrycznym i wywołać setRetainInstance (true), dać fragmentowi klucz do identyfikacji danych, a następnie pozwolić fragmentowi pobrać dane potrzebne w onCreateView z jakiegoś Trzeciego Źródła?

C: czy powinienem po prostu zrobić pusty konstruktor, a następnie w OnCreate() pobrać dane potrzebne do fragment?

Należy zauważyć, że aplikacja jest zablokowana w pionie, więc problem polega przede wszystkim na utrzymaniu obiektów, gdy Android zamyka się i użytkownik uruchamia ponownie.

Author: Unihedron, 2012-05-29

1 answers

Więc jaki byłby dobry sposób na rozpoczęcie nowych fragmentów z listą danych.

Użyj wzorca fabrycznego i "argumentów" Bundle, takich jak:

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));
  }
}

Jeśli zachowujesz swoją instancję fragment, powinieneś być w stanie uciec od używania zwykłych seterów do umieszczania rzeczy w członach danych. Argumenty Bundle są zachowywane jako część zmian konfiguracji, więc w przypadku nie zatrzymanych wystąpień jest to sposób, aby zapewnić zachowanie danych konfiguracyjnych, jeśli użytkownik obróci ekran itp.

 72
Author: CommonsWare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-29 11:52:03