Dlaczego fragmenty i kiedy używać fragmentów zamiast działań?


484

W Android API 11+ Google wydało nową klasę o nazwie Fragment.

W filmach Google sugeruje, że w miarę możliwości ( link1 , link2 ) powinniśmy używać fragmentów zamiast działań, ale nie wyjaśnili dokładnie, dlaczego.

Jaki jest cel fragmentów i niektóre możliwe ich zastosowania (inne niż niektóre przykłady interfejsu użytkownika, które można łatwo osiągnąć za pomocą prostych widoków / układów)?

Moje pytanie dotyczy fragmentów:

  1. Jakie są cele wykorzystania fragmentu?
  2. Jakie są zalety i wady korzystania z fragmentów w porównaniu do korzystania z działań / widoków / układów?

Dodatkowe pytania:

  1. Czy możesz podać naprawdę interesujące zastosowania fragmentów? Rzeczy, o których Google nie wspomniał w swoich filmach?
  2. Jaki jest najlepszy sposób komunikowania się między fragmentami a działaniami, które je zawierają?
  3. Jakie są najważniejsze rzeczy do zapamiętania podczas korzystania z fragmentów? Jakieś wskazówki i ostrzeżenia z twojego doświadczenia?


Odpowiedzi:


282

# 1 i # 2 jakie są cele korzystania z fragmentu i jakie są zalety i wady korzystania z fragmentów w porównaniu do korzystania z działań / widoków / układów?

Fragmenty to rozwiązanie Androida do tworzenia interfejsów użytkownika wielokrotnego użytku. Niektóre z tych samych rzeczy można osiągnąć za pomocą działań i układów (na przykład za pomocą dołączeń). Jednak; fragmenty są podłączone do interfejsu API Androida, od HoneyComb i więcej. Pozwól mi rozwinąć;

  • The ActionBar. Jeśli chcesz, aby zakładki tam poruszały się po Twojej aplikacji, szybko zobaczysz, że ActionBar.TabListenerinterfejs daje ci FragmentTransactionjako argument wejściowy do onTabSelectedmetody. Prawdopodobnie możesz to zignorować i zrobić coś innego i sprytnego, ale działasz przeciwko API, a nie z nim.

  • Przez FragmentManageruchwyty «Powrót» dla ciebie w bardzo sprytny sposób. Powrót nie oznacza powrotu do ostatniej aktywności, jak w przypadku zwykłych aktywności. Oznacza powrót do poprzedniego stanu fragmentu.

  • Możesz użyć cool ViewPagerza pomocą, FragmentPagerAdapteraby stworzyć interfejsy przesuwania. FragmentPagerAdapterKod jest znacznie czystsze niż zwykły adapter i kontroluje dawałaby poszczególnych fragmentów.

  • Twoje życie będzie znacznie łatwiejsze, jeśli użyjesz Fragmentów podczas próby tworzenia aplikacji zarówno na telefony, jak i tablety. Ponieważ fragmenty są tak powiązane z interfejsami API Honeycomb +, będziesz chciał użyć ich również na telefonach, aby ponownie użyć kodu. Tutaj przydaje się biblioteka kompatybilności.

  • Możesz i powinieneś używać fragmentów do aplikacji przeznaczonych tylko na telefony. Jeśli masz na myśli przenośność. Korzystam ActionBarSherlockz bibliotek zgodności i do tworzenia aplikacji „wyglądających na ICS”, które wyglądają tak samo aż do wersji 1.6. Otrzymujesz najnowsze funkcje, takie jak ActionBar, z kartami, przepełnienie, podzielony pasek akcji, przeglądarka itp.

Premia 2

Najlepszym sposobem komunikacji między fragmentami są zamiary. Kiedy naciskasz coś we fragmencie, zwykle dzwonisz StartActivity()z danymi na nim. Zamiar jest przekazywany do wszystkich fragmentów aktywności, którą uruchamiasz.


5
przede wszystkim dziękuję. doceniam ludzi, którzy udzielają pouczających (choć krótkich) odpowiedzi, a nie tylko link do instrukcji. zawsze, oprócz dodatkowych funkcji do pracy na specjalnych zajęciach, możesz pomyśleć o zaletach i wadach pracy z fragmentami ?
programista Androida

4
Myślę, że musisz być bardziej bezpośredni w zadawaniu pytań. Właśnie dałem cztery główne zalety powyżej.
Glenn Bech

2
ok, a co z wadami w porównaniu do niestandardowych widoków i działań?
programista Androida

2
jak komunikujesz się między fragmentami za pomocą intencji? czy wszystkie fragmenty muszą być „żywe” (dodane do działania), aby mogły się ze sobą komunikować?
programista Androida

55
Jeden fragment nigdy nie powinien rozmawiać bezpośrednio z innym fragmentem - zamiast tego przejdź przez działanie nadrzędne. W ten sposób nie otrzymujesz kodu spaghetti, ale kod jest łatwy w zarządzaniu.
slott

70

Nie jestem pewien, o których filmach mówisz, ale wątpię, by mówili, że powinieneś używać fragmentów zamiast działań, ponieważ nie można ich bezpośrednio zamieniać. W rzeczywistości jest dość szczegółowy wpis w Przewodniku dla deweloperów, przeczytaj go, aby uzyskać szczegółowe informacje.

Krótko mówiąc, fragmenty żyją wewnątrz działań, a każde działanie może zawierać wiele fragmentów. Podobnie jak działania, mają określony cykl życia, w przeciwieństwie do działań, nie są komponentami aplikacji najwyższego poziomu. Zalety fragmentów obejmują ponowne użycie kodu i modułowość (np. Korzystanie z tego samego widoku listy w wielu działaniach), w tym możliwość budowania interfejsów wielopanelowych (głównie przydatne na tabletach). Główną wadą jest (pewna) dodatkowa złożoność. Zasadniczo można to osiągnąć dzięki (niestandardowym) widokom w niestandardowy i mniej solidny sposób.


1
zaktualizowane pytanie. teraz ma linki do filmów Google. dziękuję również za wyjaśnienie, ale nadal potrzebuję wyjaśnienia na temat mojego pytania.
programista Androida

5
Przeczytaj wpis w przewodniku programisty, zawiera on więcej niż wystarczającą liczbę szczegółów. Jest mało prawdopodobne, że dostaniesz odpowiedź na „fajne wykorzystanie fragmentów” na SO - droga do niejasności i nie ma jednej odpowiedzi. Odpowiedź na numer 4 została szczegółowo opisana w przewodniku dewelopera-- developer.android.com/guide/topics/fundamentals/…
Nikolay Elenkov

1
o ile wiem, ta metoda tworzy zależność, która aktywność może zawierać który fragment. proszę również odpowiedzieć na główne pytania (pierwsze dwa).
programista Androida

3
Podziękowania dla programisty Androida za naleganie na odpowiedzi na podstawowe pytanie. ATM Nie widziałem nic przydatnego w klasie Fragment nad używaniem znacznika XML „include”. Rzeczy, które uznałbym za wartościowe, to możliwość określenia jednego układu, który magicznie przekształciłby się w najlepszą obsługę dla wszystkich rozdzielczości. Z tego, co mogę powiedzieć, nadal musisz zrobić to sam w kodzie. Inną potencjalną wartością może być sposób łączenia kodu + zasobów w komponenty wielokrotnego użytku, których nie można znaleźć w aplikacjach do ponownego użycia, ale znowu nie wydaje się, że tam są. Chcę jednego naprawdę dobrego powodu.
Melinda Green,

2
Zaczynam rozumieć sposób, w jaki Google sugeruje używanie fragmentów, ale całkiem zgadzam się z @NikolayElenkov .. Dla mnie korzystanie z działań nadal wydaje się być najbardziej niezawodnym i mniej złożonym sposobem ..
andrea.rinaldi

49

Fragment jest elementem interfejsu użytkownika lub zachowania aplikacji, które można umieścić w działaniu, które umożliwia bardziej modułowy projekt działania. Nie będzie źle, jeśli powiemy, że fragment jest rodzajem subaktywności.

Oto ważne uwagi dotyczące fragmentu:

  1. Fragment ma własny układ i własne zachowanie z własnymi wywołaniami zwrotnymi cyklu życia.

  2. Możesz dodawać lub usuwać fragmenty działania, gdy działanie jest uruchomione.

  3. Możesz łączyć wiele fragmentów w jednym działaniu, aby utworzyć wielopanelowy interfejs użytkownika.

  4. Fragment można wykorzystać w wielu działaniach.

  5. Cykl życia fragmentu jest ściśle związany z cyklem życia jego aktywności gospodarza.

  6. Kiedy aktywność zostanie wstrzymana, wszystkie dostępne fragmenty aktywności również zostaną zatrzymane.

  7. Fragment może implementować zachowanie bez komponentu interfejsu użytkownika.

  8. Fragmenty zostały dodane do Android API w Android 3 (Honeycomb) z API w wersji 11.

Aby uzyskać więcej informacji, odwiedź oficjalną stronę Fragments .


1. Jak wspomniałeś w punkcie 8, nie musi on mieć układu. 6. przegapiłeś część po „oznacza”. W każdym razie dzięki za pomoc innym w wyjaśnieniu. Dam ci +1.
programista Androida

1
Jeśli chodzi o # 8, możliwym przykładem fragmentu bez układu (tj. Fragmentu „bezgłowego”) byłby taki, który wykonuje zadanie, które pomimo tego, że jest nieco krótkie (takie jak krótkie żądanie HTTP), jest nadal wymagane, aby przetrwać zmiany konfiguracji, a zatem zależy na dokładnej instancji fragmentu zachowanej na nich (za pomocą setRetainInstance (true) na fragmencie). Jeśli chodzi o fragmenty układu, setRetainInstance (true) nie ma większego sensu, ponieważ zapobiega uwalnianiu zasobów związanych z ich widokami, gdy jest to konieczne (tj. Wyciek pamięci).
Piovezan,

UWAGA: „# 8” to teraz „# 7”.
ToolmakerSteve

21

To ważna informacja, którą znalazłem na fragmentach:

Historycznie każdy ekran w aplikacji na Androida był implementowany jako osobne działanie. Stwarza to wyzwanie przy przekazywaniu informacji między ekranami, ponieważ mechanizm Android Intent nie pozwala na przekazywanie typu odniesienia (tj. Obiektu) bezpośrednio między Działaniami. Zamiast tego obiekt musi zostać zserializowany lub udostępnione globalnie odwołanie.

Dzięki temu, że każdy ekran jest osobnym fragmentem, całkowicie eliminuje się ból głowy związany z przekazywaniem danych. Fragmenty zawsze istnieją w kontekście danego działania i zawsze mogą uzyskać do niego dostęp. Przechowując interesujące informacje w ramach działania, fragment dla każdego ekranu może po prostu uzyskać dostęp do odwołania do obiektu za pośrednictwem działania.

Źródło: https://www.pluralsight.com/blog/software-development/android-fragments


3
To prawda, ale istnieją na to rozwiązania: użyj Parcelable, gdy nie jest to duży obiekt (a jest to wtyczka, aby to ułatwić), a jeśli jest to ogromny obiekt, zawsze możesz użyć statycznego odwołania, które będzie ustawione na null kiedy dojdziesz do nowej aktywności (lub kiedy ją zniszczysz, w zależności od twoich wymagań).
programista Androida

@androiddeveloper: „use Parcelable” pasuje do mojej definicji „bólu głowy przenoszącego dane, którego unika się za pomocą Fragmentów”. Jeśli istnieje złożony stan współdzielenia, który musi się utrzymywać podczas przechodzenia szeregu ekranów, dobrym rozwiązaniem jest działanie + fragmenty, IMHO. (Chociaż zrezygnowałem z tylnego stosu Fragment i sam zarządzałem tym, co oznacza „powrót”).
ToolmakerSteve

Używanie wzorca projektowania interfejsu między fragmentami poprzez działanie kontenera jest bardzo modułowym podejściem do przekazywania nie tylko obiektów, ale także detektorów zdarzeń kliknięcia i argumentów metod z powrotem do innych fragmentów lub głównej aktywności kontenera.
Kaveesh Kanwal

10

Aktywności to komponenty pełnoekranowe w aplikacji z paskiem narzędzi, wszystko inne to najlepiej Fragmenty. Jedna pełnoekranowa aktywność nadrzędna z paskiem narzędzi może zawierać wiele paneli, przewijalne strony, okna dialogowe itp. (Wszystkie fragmenty), do których można uzyskać dostęp od rodzica i komunikować się przez rodzica.

Przykład:

Działanie A, Działanie B, Działanie C:

  • Wszystkie działania muszą mieć powtarzany ten sam kod, aby na przykład wyświetlić podstawowy pasek narzędzi lub dziedziczyć po działaniu nadrzędnym (zarządzanie nim staje się kłopotliwe).
  • Aby przejść z jednej czynności do drugiej, albo wszystkie muszą być w pamięci (nad głową), albo jedna musi zostać zniszczona, aby druga mogła się otworzyć.
  • Komunikacja między działaniami może odbywać się za pośrednictwem Intentów.

vs

Działanie A, fragment 1, fragment 2, fragment 3:

  • Bez powtarzania kodu, wszystkie ekrany mają paski narzędzi itp. Z tego jednego działania.
  • Kilka sposobów przejścia z jednego fragmentu do następnego - przeglądanie pagera, wielu okien itp.
  • Aktywność zawiera większość danych, więc wymagana jest minimalna komunikacja między fragmentami. W razie potrzeby można to łatwo zrobić za pomocą interfejsów.
  • Fragmenty nie muszą być pełnoekranowe, duża elastyczność w ich projektowaniu.
  • Fragmenty nie muszą zawyżać układu, jeśli widoki nie są konieczne.
  • Kilka działań może wykorzystywać ten sam fragment.

idealna odpowiedź!
Sathesh

8

Fragmenty są szczególnie przydatne w niektórych przypadkach, na przykład gdy chcemy przechowywać szufladę nawigacji na wszystkich naszych stronach. Możesz nadmuchać układ ramki dowolnym fragmentem i nadal mieć dostęp do szuflady nawigacji.

Jeśli używałeś działania, musiałbyś zachować szufladę we wszystkich działaniach, co tworzy zbędny kod. To jedno ciekawe zastosowanie fragmentu.

Jestem nowym użytkownikiem Androida i nadal uważam, że fragment jest w ten sposób pomocny.


Tak. Nadal jednak czasami mylę się co do właściwego sposobu korzystania z fragmentów, a to z powodu złożonego cyklu życia zarówno fragmentów, jak i działań.
programista Androida

@androiddeveloper czy najczęściej korzystasz z aktywności?
Michael Alan Huff

@MichaelAlanHuff Podczas obsługi tabletów myślę, że lepiej jest używać Fragmentów. Ponadto, gdy obsługujesz zmiany orientacji i inne podobne zdarzenia, możesz użyć DialogFragment, ponieważ pozwala je przywrócić
programista Androida

@androiddeveloper, tak też myślę. Nie używałem DialogFragments tak często. Aby pomóc modułowości logiki, wielu programistów Androida zaczyna używać niestandardowych widoków, aby utrzymać logikę w moździerzu. Oto niedawna rozmowa na temat niestandardowych widoków wygłoszona przez inżyniera z Airbnb vimeo.com/127799187
Michael Alan Huff

@MichaelAlanHuff przy użyciu fragmentów może być również przydatny, jeśli uważasz, że bieżący ekran może być częścią innego ekranu.
deweloper Androida

5

Wiem, że zostało to już omówione na śmierć, ale chciałbym dodać jeszcze kilka punktów:

  • Fragmenty mogą być używane do wypełniania Menus i mogą MenuItemsame obsługiwać kliknięcia. Daje to dalsze opcje modulacji dla twoich działań. Możesz robić rzeczy ContextualActionBar i tak dalej, nie wiedząc o tym swojej Aktywności, i możesz w zasadzie oddzielić ją od podstawowych czynności obsługiwanych przez Aktywność (Nawigacja / Ustawienia / Informacje).

  • Frag nadrzędny z fragmentami potomnymi może dać ci dodatkowe opcje modulowania twoich komponentów. Np. Możesz łatwo zamieniać fragmenty, umieszczać nowe fragmenty w pagerze lub usuwać je, zmieniać ich kolejność. Wszystko bez Twojej aktywności, żeby coś o tym wiedzieć, koncentrując się na rzeczach na wyższym poziomie.


0

Fragmenty żyją w ramach działania i mają:

  • własny cykl życia
  • własny układ
  • własne fragmenty potomne itp.

Pomyśl o Fragmentach jako poddziałaniu głównego działania, do którego należy, nie może ono istnieć samo w sobie i może być wywoływane / ponownie używane wielokrotnie. Mam nadzieję że to pomoże :)


W rzeczywistości, w odniesieniu do drugiego punktu („własnego układu”), jest to opcjonalne. Fragment wcale nie musi mieć widoku.
programista Androida

0

1.Cele wykorzystania fragmentu?

  • Odp .:
    1. Radzenie sobie z różnicami kształtu urządzenia.
    2. Przekazywanie informacji między ekranami aplikacji.
    3. Organizacja interfejsu użytkownika.
    4. Zaawansowane metafory interfejsu użytkownika.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.