Wprowadzenie:
Podstawowy wzorzec „Fragment Tutorial” wygląda mniej więcej tak:
- Na tablecie miej listę po lewej, szczegóły po prawej.
- Oba są
Fragments
i oba znajdują się w tym samymActivity
. - Na telefonie miej listę
Fragment
w jednymActivity
. - Uruchom nowy
Activity
ze szczegółamiFragment
.
(np. API 3.0 Fragments API autorstwa Dianne Hackborn i Przewodnik API Fragments API )
Na obu urządzeniach funkcjonalność znajduje się w Fragments
. (prosty)
Na tablecie cała aplikacja to 1Activity
, na telefonie jest ich wieleActivities
.
Pytania:
- Czy istnieje powód, aby podzielić aplikację telefonu na wiele
Activities
?
Jednym z problemów związanych z tą metodą jest to, że powielasz dużo logiki na głównym tablecie Activity
i na osobnym telefonie Activities
.
- Czy nie byłoby łatwiej zachować model 1 działania w obu przypadkach przy użyciu tej samej logiki włączania
Fragments
i wyłączania (przy użyciu innego układu)?
W ten sposób większość logiki znajduje się w Fragments
sobie, a Activity
kodowanie jest tylko jedno .
Przeczytałem też o tym ActionBarSherlock
, że wydaje się, że działa najlepiej Fragments
zamiast Activities
(ale jeszcze z tym nie pracowałem).
Czy samouczki są nadmiernie uproszczone, czy też pominąłem coś ważnego w tym podejściu?
Wypróbowaliśmy oba podejścia z powodzeniem w biurze - ale mam zamiar rozpocząć większy projekt i chcę, aby wszystko było jak najłatwiejsze.
Niektóre linki do powiązanych pytań:
- Dylemat: kiedy używać Fragmentów vs Aktywności:
- Określa, kiedy należy zastosować Przejście aktywności vs Fragmenty dynamiczne
- Android - potrzebuję wyjaśnień fragmentów w porównaniu do działań i widoków
- Aktywności lub fragmenty w Androidzie?
- Projektowanie interakcji wielu fragmentów i działań
- Jakie są dokładne zalety Fragmentów w Androidzie 3.0?
Aktualizacje
Zacząłem nagrodę od pytania - wciąż nie jestem przekonany, dlaczego muszę powielać logikę aplikacji w aktywności na tablecie i każdej aktywności na telefonie.
Znalazłem także ciekawy artykuł od facetów z Square, który warto przeczytać:
źródło
onItemSelected()
metody w ćwiczeniu . W mojej „prawdziwej” aplikacji mam wiele list i podlist. Ten wzorzec sugeruje, że moja Aktywność na karcie musi miećonItemSelected()
metodę obsługi każdej z list. Co więcej, działania telefoniczne muszą mieć tę samą logikę zduplikowaną w każdym z nich. IMHO o wiele lepiej jest umieścić logikę wyboru przedmiotu w każdym fragmencie - nie ma duplikacji i wolę ten sposób strukturyzacji kodu. Mam nadzieję, że to pomożeOdpowiedzi:
Zgadzam się, że samouczki są bardzo uproszczone. Po prostu wprowadzają,
Fragments
ale nie zgadzam się z sugerowanym wzorem.Zgadzam się również, że powielanie logiki aplikacji w wielu działaniach nie jest dobrym pomysłem (patrz Zasada DRY na Wikipedii ).
Wolę wzór używany przez
ActionBarSherlock
aplikację Fragments Demo ( pobierz tutaj i kod źródłowy tutaj ). Demo, które najbardziej odpowiada samouczkowi wspomnianemu w pytaniu, to „Layout” w aplikacji; lubFragmentLayoutSupport
w kodzie źródłowym.W tym demo logika została przeniesiona z
Activity
i doFragment
. WTitlesFragment
rzeczywistości zawiera logikę zmiany Fragmentów. W ten sposób każde działanie jest bardzo proste. Duplikowanie wielu bardzo prostych działań, w których nie ma żadnej logiki, sprawia, że jest to bardzo proste.Umieszczając logikę we Fragmentach, nie trzeba pisać kodu więcej niż jeden raz ; jest dostępny bez względu na to, w którą czynność jest umieszczony Fragment. To sprawia, że jest to bardziej wydajny wzór niż ten sugerowany w podstawowym samouczku.
Kolejną zaletą wzoru ABS jest to, że nie kończy się na działaniu tabletu zawierającym dużo logiki, a to oznacza, że oszczędzasz pamięć. Wzorzec samouczka może prowadzić do bardzo dużej głównej aktywności w bardziej złożonej aplikacji; ponieważ musi obsłużyć logikę wszystkich fragmentów, które zostaną w nim umieszczone w dowolnym momencie.
Ogólnie rzecz biorąc, nie myśl o tym jako o konieczności korzystania z wielu działań. Pomyśl o tym jako o możliwości podzielenia kodu na wiele fragmentów i oszczędzania pamięci podczas ich używania.
źródło
Myślę, że jesteś na dobrej drodze. (I tak, samouczki są nadmiernie uproszczone).
W układzie tabletu można użyć pojedynczego działania i zamieniać fragmenty (w wielu oknach). W układzie telefonu możesz użyć nowej Aktywności dla każdego Fragmentu.
Tak jak:
Może się to wydawać dużo dodatkowej pracy, ale używając wielu działań na telefony, włączasz podstawowy cykl życia działania i przekazywanie celowe. Pozwala to również frameworkowi na obsługę wszystkich animacji i stosu.
Aby zmniejszyć kod, możesz użyć
BaseActivity
i rozszerzyć od tego.Więc jeśli użytkownik ma tablet, którego byś użył
MyMultiPaneFragActivity
lub coś podobnego. To działanie jest odpowiedzialne za zarządzanie wywołaniami zwrotnymi z fragmentów i kierowaniem zamiarów do odpowiedniego fragmentu (np. Zamiaru wyszukiwania)Jeśli użytkownik ma telefon, możesz użyć zwykłego działania z bardzo małym kodem i rozszerzyć go
MyBaseSingleFragActivity
lub coś podobnego. Działania te mogą być bardzo proste, 5-10 linii kodu (może nawet mniej).Trudna część to rutowanie zamiarów i tak dalej. * (Edycja: zobacz więcej poniżej).
Myślę, że powodem tego jest zalecany sposób oszczędzania pamięci i zmniejszenia złożoności i sprzężenia. Jeśli wymieniasz Fragmenty,
FragmentManager
zachowuje odniesienie do tego Fragmentu dla stosu wstecznego. Upraszcza również to, co powinno być „uruchomione” dla użytkownika. Ta konfiguracja oddziela także widoki, układ i logikę Fragmentu od cyklu życia Aktywności. W ten sposób Fragment może istnieć w pojedynczym działaniu, obok innego fragmentu (dwupanelowego) lub w trzypantowym Działaniu itp.* Jedną z korzyści regularnego routingu celowego jest to, że możesz uruchomić działanie jawnie z dowolnego miejsca na tylnym stosie. Jednym z przykładów może być w przypadku wyników wyszukiwania. (MySearchResults.class).
Przeczytaj tutaj, aby uzyskać więcej:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
źródło
Oto odpowiedź Reto Meiera na ten sam temat, zaczerpnięta z filmu z kursu Podstawy Androida w Udacity .
źródło
We wzorcu wzorcowym istnieją dwie czynności. Jeden pokazuje oba fragmenty na większych ekranach i tylko fragment „wzorcowy” na mniejszych ekranach. Drugi pokazuje fragment „szczegółów” na mniejszych ekranach.
Twoja logika szczegółowa powinna być związana z fragmentem szczegółowym. W związku z tym nie występuje powielanie kodu związane z logiką szczegółów między działaniami - działanie szczegółowe wyświetla tylko fragment szczegółów, być może przekazując dane z
Intent
dodatkowego.ActionBarSherlock nie ma więcej wspólnego z fragmentami niż natywny pasek akcji, ponieważ ActionBarSherlock jest jedynie backportem natywnego paska akcji.
źródło
Odnosząc się do pierwszego pytania „Czy istnieje powód, aby podzielić aplikację telefonu na wiele działań?” - Tak. sprowadza się to po prostu do dostępnej przestrzeni, tablet daje więcej miejsca dla programistów, umożliwiając programistom umieszczenie większej liczby elementów na jednym ekranie. Android informuje nas, że Działania mogą zapewnić ekran . Tak więc, co możesz zrobić z 1 dużym ekranem na tablecie, jest czymś, co może wymagać podziału na wiele ekranów w telefonie, ponieważ nie ma wystarczającej ilości miejsca na wszystkie fragmenty.
źródło