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

Odpowiedz Nowy wątek
2018-11-22 20:04
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?

Android apps that dominate the market Ingic provides stellar Android application development services across the world https://www.ingic.ae/android-app-development/ - Gracelily 2018-11-23 07:54

Pozostało 580 znaków

2018-11-22 20:51
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.

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? - Blue_Carpet 2018-11-22 21:49

Pozostało 580 znaków

2018-11-22 22:06
0

W jakim celu korzystasz z fragmentów?

Podmieniam część aktywności np. podczas dodawania, edycji obiektu, również listę wszystkich obiektów przechowuje we fragmencie i w odpowiednim momencie podmieniam zawartość, bo po co mam tworzyć oddzielne aktywności na te czynności ;c - Blue_Carpet 2018-11-22 22:21
@Blue_Carpet: na temat odpowiadaj w postach! - furious programming 2018-11-22 22:45
@furious programming a to te dwa posty mają związek z moim zapytaniem, albo w jakis sposob opisuja problem, rozwiazuja? ;/ - Blue_Carpet 2018-11-22 23:02
Mam je usunąć tylko dlatego, że ktoś napisał Ci, że to kiepskie rozwiązanie i zadał pytanie co do powodu użycia frameworku? - furious programming 2018-11-22 23:05
W końcu sam zapytałeś „czy jest to poprawne?” – więc się nie dziw treści tych dwóch postów. - furious programming 2018-11-22 23:06

Pozostało 580 znaków

2018-11-23 15:19
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.

edytowany 1x, ostatnio: Michał Sikora, 2018-11-23 15:20
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. - Blue_Carpet 2018-11-23 16:53
Nie prowadź wątku w komentarzach. - Michał Sikora 2018-11-23 17:55

Pozostało 580 znaków

2018-11-23 17:54
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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