Sposoby przesyłania danych między aktywnością i fragmentami oraz pomiędzy fragmentami

0

Witam,
Moje pytanie jest następujące.
Mam jedno aktywność oraz kilka fragmentów. Fragmenty wyświetlają np. różne dane z custom listview.
Czy poprawne jest odczytywanie danych we fragmencie w następujący sposób:
W aktywności mam listę, którą inicjalizuje przy jej tworzeniu i wypełniam odpowiednimi danymi.
Następnie we fragmencie jeżeli potrzebuje coś wykonać na tej liście to pobieram ją przez publiczną metodę (getter) zdefiniowaną w aktywności:

dane = ((Aktywnosc)getActivity()).getMetoda();

Na początku przesyłałem dane przez obiekt Bundle, ale uznałem, że taki sposób jest bardziej wygodny i ułatwia mi komunikację między aktywnością, a fragmentami. Czy jest to poprawne?

0

Jest to bardzo kiepskie rozwiązanie. Z dwojga złego przesyłanie danych przez Bundle będzie dużo lepsze niż to, co teraz robisz.

0

W jakim celu korzystasz z fragmentów?

0
Blue_Carpet napisał(a):

ale dlaczego jest to złe rozwiązanie? Jakies inne rozwiązania? Nie rozumiem, mam przerzucać podczas działania aplikacji np. 100 razy liste do fragmentu i z powrotem, napisałeś, że jest to złe rozwiązanie ale dlaczego?

Z kilku powodów. Po pierwsze dlatego, że uzależniasz wtedy swój fragment od tego jednej konkretnej aktywności, której tam może nie być. Po drugie trzymanie danych w aktywności ma swoje własne problemy związane z cyklem życia. Ponadto utrudniasz sobie w ten sposób pracę w przyszłości, bo teraz każda klasa, która chce mieć dostęp do tej listy musi być w jakiś sposób zależna od aktywności. Jeżeli nie będziesz bardzo ostrożnie zarządzał takim kodem, to oberwiesz wyciekami pamięci. Po trzecie powinno ograniczać się odpowiedzialność klas, a odpowiedzialnością aktywności na pewno nie jest przechowywanie danych.

Czy należy przekazywać przez Bundle? Może... bardzo zależy od tego, do czego ta lista ma służyć we fragmencie. Zazwyczaj nie powinno się tego robić. Tak naprawdę to należałoby mieć jakąś klasę, która służyłaby do zarządzania danymi. Jej instancja powinna istnieć poza cyklem życia i powinna być udostępniona zarówno do aktywności jak i fragmentów. Najlepiej poprzez jakąś warstwę prezentacji, która byłaby niezależna od frameworka.

1
Blue_Carpet napisał(a):

Okej, dzięki za odpowiedź. Ale jezeli jest to aplikacja składająca się z jednej aktywności i np. 5 fragmentów to czy mogę tak zrobić? Jak opisałem, w aplikacji występuje jedna aktywność, a w niej kilka fragmentów.

Możesz tak zrobić nawet w aplikacji, która ma setki widoków. Pytanie czy chcesz pisać aplikację, którą da się rozwijać i utrzymać czy nie. Zapytałeś czy to jest poprawne. No to odpowiedź jest taka, że to nie jest poprawne. Ja bym tak nie zrobił nawet jakby to była aplikacja składająca się z 2 fragmentów. Dla małej aplikacji bez warstw prezentacji stworzyłbym jakąś klasę, która byłaby odpowiedzialna za przechowywanie danych, utworzył jej jedną instancję poza cyklem życia i przekazywał tam gdzie trzeba. Na przykład w ten sposób.

public final class MyApplication extends Application {
  private MyDataStorage myDataStorage;

  @Override public void onCreate() {
    super.onCreate();
    myDataStorage = new MyDataStorage(this);
  }

  public static MyDataStorage myDataStorage(Context context) {
    return ((MyApplication) context.getApplicationContext()).myDataStorage;
  }
}

Założyłem, że MyDataStorage potrzebuje kontekstu do utworzenia dlatego nie jest polem finalnym i jest tworzone w onCreate. Jeżeli nie byłoby takiej potrzeby, to najlepiej zrobić z tego pole finalne. Potem mógłbyś się dostać do MyDataStorage z każdej aktywności i z każdego fragmentu. Byłoby to bardzo ubogie rozwiązanie, ale dla małych aplikacji wystarczające. Zwłaszcza takich, gdzie nie tworzy się warstwy prezentacji. W tym rozwiązaniu pojawia się problem związany ze śmiercią aplikacji, ale nie da się go uniknąć, jeżeli nie zapisujemy niczego na trwałe na urządzeniu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0