Wiem, że Activities
zostały zaprojektowane tak, aby reprezentować pojedynczy ekran mojej aplikacji, podczas gdy Fragments
zostały zaprojektowane tak, aby były układami interfejsu wielokrotnego użytku z wbudowaną logiką.
Do niedawna opracowałem aplikację, ponieważ mówiono, że należy ją opracować. Stworzyłem an Activity
reprezentujący ekran mojej aplikacji i użyłem Fragmentów dla ViewPager
lub Google Maps
. Rzadko tworzyłem ListFragment
interfejs użytkownika, który może być wielokrotnie używany.
Ostatnio natknąłem się na projekt, który zawiera tylko 2 Activities
jeden jest, SettingsActivity
a drugi to MainActivity
. Układ MainActivity
jest zapełniony wieloma ukrytymi pełnoekranowymi fragmentami interfejsu użytkownika i tylko jeden jest pokazany. W Activity
logice jest wiele FragmentTransitions
różnych ekranów aplikacji.
Podobało mi się to, że ponieważ aplikacja używa an ActionBar
, pozostaje nienaruszona i nie porusza się wraz z animacją przełączania ekranu, co dzieje się z Activity
przełączaniem. Daje to bardziej płynne odczucie przejścia między ekranami.
Myślę więc, że chcę podzielić się twoim obecnym sposobem programowania w tym temacie. Wiem, że na pierwszy rzut oka może to wyglądać na pytanie oparte na opiniach, ale patrzę na to jako na pytanie dotyczące projektowania i architektury Androida ... oparty na opiniach.
AKTUALIZACJA (01.05.2014): Po tej prezentacji Erica Burke z Square (muszę powiedzieć, że jest świetną prezentacją z wieloma przydatnymi narzędziami dla programistów Androida. I nie jestem w żaden sposób związany z Square)
http://www.infoq.com/presentations/Android-Design/
Z mojego osobistego doświadczenia w ciągu ostatnich kilku miesięcy odkryłem, że najlepszym sposobem na zbudowanie moich aplikacji jest tworzenie grup fragmentów, które reprezentują przepływ w aplikacji i prezentują wszystkie te fragmenty w jednym Activity
. Zasadniczo będziesz mieć taką samą liczbę Activities
w aplikacji, jak liczba przepływów. W ten sposób pasek akcji pozostaje nienaruszony na wszystkich ekranach przepływu, ale jest odtwarzany po zmianie przepływu, co ma sens. Jak stwierdza Eric Burke i jak sobie uświadomiłem, filozofia używania jak najmniejszej Activities
liczby nie ma zastosowania do wszystkich sytuacji, ponieważ powoduje bałagan w tym, co nazywa aktywnością „Boga”.
Odpowiedzi:
Eksperci powiedzą ci: „Kiedy zobaczę interfejs użytkownika, będę wiedział, czy użyć„
Activity
czyFragment
”. Na początku nie będzie to miało sensu, ale z czasem będziesz w stanie stwierdzić, czy potrzebujesz,Fragment
czy nie.Jest taka dobra praktyka, która jest dla mnie bardzo pomocna. Przyszło mi do głowy, kiedy próbowałem coś wyjaśnić mojej córce.
Wyobraź sobie pole przedstawiające ekran. Czy możesz załadować kolejny ekran w tym polu? Jeśli użyjesz nowego pudełka, czy będziesz musiał skopiować wiele elementów z pierwszego pudełka? Jeśli odpowiedź brzmi Tak, powinieneś użyć
Fragments
, ponieważ rootActivity
może przechowywać wszystkie zduplikowane elementy, aby zaoszczędzić czas w ich tworzeniu, i możesz po prostu wymienić części pudełka.Ale nie zapominaj , że zawsze potrzebujesz kontenera (
Activity
) lub twoje części zostaną rozproszone. Więc jedno pudełko z częściami w środku.Uważaj, aby nie nadużywać pudełka. Eksperci od Androida UX doradzają (można je znaleźć na YouTube), kiedy powinniśmy jawnie załadować inny
Activity
, zamiast tego użyćFragment
(na przykład, gdy mamy do czynienia z szufladą nawigacji, która ma kategorie). Gdy poczujesz się komfortowoFragments
, możesz oglądać wszystkie ich filmy. Co więcej, są to materiały obowiązkowe.Można teraz spojrzeć na UI i dowiedzieć się, czy potrzebny jest
Activity
alboFragment
? Czy masz nową perspektywę? Myślę, że tak.źródło
Moja filozofia jest następująca:
Utwórz działanie tylko wtedy, gdy jest to absolutnie wymagane. Po udostępnieniu tylnego stosu do zatwierdzania wielu transakcji fragmentarycznych staram się tworzyć jak najmniej działań w mojej aplikacji. Ponadto komunikacja między różnymi fragmentami jest znacznie łatwiejsza niż przesyłanie danych tam iz powrotem między czynnościami.
Przejścia aktywności są drogie, prawda? Przynajmniej tak mi się wydaje - ponieważ stara aktywność musi zostać zniszczona / wstrzymana / zatrzymana, wypchnięta na stos, a następnie nowa aktywność musi zostać utworzona / uruchomiona / wznowiona.
To tylko moja filozofia, odkąd zostały wprowadzone fragmenty.
źródło
onActivityResult()
jest bezpieczniejszy i łatwiejszy niż wywołania zwrotne fragmentów.Cóż, zgodnie z wykładami Google (być może tutaj , nie pamiętam), powinieneś rozważyć użycie Fragmentów, gdy tylko jest to możliwe, ponieważ ułatwia to utrzymanie i kontrolę kodu.
Myślę jednak, że w niektórych przypadkach może stać się zbyt skomplikowany, ponieważ działanie, które obsługuje fragmenty, wymaga nawigacji / komunikacji między nimi.
Myślę, że powinieneś sam zdecydować, co jest dla ciebie najlepsze. Zazwyczaj konwersja działania na fragment i odwrotnie jest trudna.
Utworzyłem post o tym dillema tutaj , jeśli chcesz przeczytać trochę dalej.
źródło
Dlaczego wolę fragment we wszystkich przypadkach.
Aktywność jest droga. W Fragmentie widoki i stany właściwości są oddzielone - za każdym razem, gdy fragment jest w środku
backstack
, jego widoki zostaną zniszczone. Dzięki temu możesz kumulować o wiele więcej Fragmentów niż Aktywność.Backstack
manipulacja. DziękiFragmentManager
łatwo jest usunąć wszystkie fragmenty, wstawić więcej niż na fragmentach itp. Ale dla Activity manipulowanie tymi rzeczami będzie koszmarem.Bardzo przewidywalny cykl życia . Dopóki aktywność gospodarza nie jest poddawana recyklingowi Fragmenty z plecaka nie zostaną poddane recyklingowi. Można więc użyć
FragmentManager::getFragments()
do znalezienia określonego Fragmentu (nie zachęca się).źródło
Od Jetpack , aplikacja Single-aktywny jest preferowanym architektura. Przydatne zwłaszcza w przypadku komponentu architektury nawigacji .
źródło
źródło
Moim zdaniem nie ma to większego znaczenia. Kluczowym czynnikiem do rozważenia jest
Głównym zastosowaniem fragmentów jest budowanie działań wielopłaszczyznowych, co czyni go idealnym dla aplikacji reagujących na tablety / telefony.
źródło
Nie zapominaj, że działanie jest blokiem / komponentem aplikacji, który można udostępniać i uruchamiać za pośrednictwem aplikacji Intent! Dlatego każde działanie w Twojej aplikacji powinno rozwiązać tylko jeden rodzaj zadania. Jeśli masz tylko jedno zadanie w swojej aplikacji, myślę, że potrzebujesz tylko jednego działania i wielu fragmentów w razie potrzeby. Oczywiście możesz ponownie wykorzystać fragmenty w przyszłych działaniach, które rozwiązują inne zadania. Takie podejście będzie jasne i logiczne rozdzielenie zadań. I nie ma potrzeby utrzymywania jednej aktywności z różnymi parametrami filtrów intencji dla różnych zestawów fragmentów. Zdefiniuj zadania na etapie projektowania procesu programowania w oparciu o wymagania.
źródło
Jest to coś więcej niż zdajesz sobie sprawę, musisz pamiętać, że uruchomione działanie nie zniszczy pośrednio działania wywołującego. Jasne, możesz ustawić go tak, aby użytkownik kliknął przycisk, aby przejść do strony, rozpocząć aktywność tej strony i zniszczyć bieżącą. Powoduje to duże koszty ogólne. Najlepszy przewodnik, jaki mogę ci dać, to:
** Rozpocznij nową aktywność tylko wtedy, gdy ma sens jednoczesne otwieranie głównej aktywności (ta dotyczy wielu okien).
Świetnym przykładem tego, kiedy sensowne jest prowadzenie wielu działań, to Dysk Google. Główną działalnością jest eksplorator plików. Po otwarciu pliku uruchamiane jest nowe działanie, aby wyświetlić ten plik. Możesz nacisnąć przycisk ostatnich aplikacji, który pozwoli ci wrócić do przeglądarki bez zamykania otwartego dokumentu, a może nawet otworzyć inny dokument równolegle do pierwszego.
źródło
attach
/detach
metod.Rzecz, którą zrobiłem: używając mniej fragmentu, jeśli to możliwe. Niestety jest to prawie możliwe. Skończyło się na tym, że mam wiele fragmentów i trochę działań. Niektóre wady, które zauważyłem:
ActionBar
& Menu: gdy 2 fragment ma inny tytuł, menu, którebędzie trudne w obsłudze. Np .: podczas dodawania nowego fragmentu możesz zmienić tytuł paska akcji, ale kiedy go wyskoczysz,
backstack
nie ma możliwości przywrócenia starego tytułu. W tym przypadku możesz potrzebować paska narzędzi w każdym fragmencie, ale uwierz mi, że poświęci ci to więcej czasu.startForResult
, aktywność ma, ale fragment nie.Moim rozwiązaniem jest użycie działania do zawinięcia fragmentu. Mamy więc osobny pasek akcji, menu
startActivityForResult
, animację, ...źródło
getSupportFragmentManager().addOnBackStackChangedListener
aby dodać detektor. pobierz bieżący fragment w tym detektorze, a następnie ustaw tytuł i inne rzeczy.Jedną wielką zaletą
fragment
nad działaniem jest to, że kod użyty do fragmentu może być użyty do różnych działań, więc zapewnia możliwość ponownego wykorzystania kodu w rozwoju aplikacji.źródło
używać jednej aktywności na stosowanie w celu zapewnienia podstawy do
fragment
stosowaniafragment
na ekranie,fragments
to masa lite w stosunku doactivites
części są wielokrotnego użytku fragmentów lepiej dostosowane do aplikacji, które obsługują zarówno telefon i tabletkęźródło
Możesz użyć jednego z nich.
Zasadniczo musisz ocenić, który jest najlepszy dla Twojej aplikacji. Pomyśl o tym, jak będziesz zarządzać przepływem biznesu i jak przechowywać / zarządzać preferencjami danych.
Pomyśl, jak Fragmenty przechowują dane śmieci. Po wdrożeniu fragmentu użytkownik ma główny katalog aktywności do wypełnienia fragmentem (fragmentami). Tak więc, jeśli próbujesz wdrożyć wiele działań ze zbyt dużą ilością fragmentów, musisz wziąć pod uwagę wydajność swojej aplikacji, ponieważ manipulujesz (grubo mówiąc) dwoma cyklami życia kontekstu, pamiętaj o złożoności.
Pamiętaj: czy powinienem używać fragmentów? Dlaczego nie powinienem?
pozdrowienia.
źródło
Używam Fragmentów dla lepszego doświadczenia użytkownika. Na przykład, jeśli masz przycisk i chcesz uruchomić, powiedzmy usługę internetową po kliknięciu, dołączam fragment do działania nadrzędnego.
W ten sposób użytkownik nie będzie musiał wykonywać innej czynności.
Po drugie, wolę Fragmenty, ponieważ można je łatwo obsługiwać podczas rotacji.
źródło
To zależy od tego, co naprawdę chcesz zbudować. Na przykład
navigation drawer
wykorzystuje fragmenty. Używajfragments
również kart . Inną dobrą implementacją jest miejsce, w którym maszlistview
. Po obróceniu telefonu i kliknięciu wiersza aktywność jest wyświetlana na pozostałej połowie ekranu. Osobiście używamfragments
ifragment dialogs
, ponieważ jest bardziej profesjonalny. Ponadto są obsługiwane łatwiej w rotacji.źródło