Piszę aplikację na tablety 4.0 i 4.1, dla których nie chcę korzystać z bibliotek wsparcia (jeśli nie są potrzebne), ale tylko w związku z tym 4.x api.
Więc moja platforma docelowa jest bardzo dobrze zdefiniowana jako:> = 4.0 i <= 4.1
Aplikacja ma układ wielopanelowy (dwa fragmenty, jeden mały po lewej, jeden fragment treści po prawej) oraz pasek akcji z zakładkami.
Podobne do tego:
Kliknięcie zakładki na pasku akcji zmienia fragment „zewnętrzny”, a fragment wewnętrzny jest fragmentem z dwoma zagnieżdżonymi fragmentami (1. mały fragment lewej listy, 2. szeroki fragment treści).
Zastanawiam się teraz, jaka jest najlepsza praktyka zastępowania fragmentów, a zwłaszcza fragmentów zagnieżdżonych. ViewPager jest częścią biblioteki obsługi, nie ma natywnej alternatywy 4.x dla tej klasy. Wydają się być „zdezaktualizowani” w moim rozumieniu. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Następnie przeczytałem informacje o wydaniu dla Androida 4.2, dotyczące tego ChildFragmentManager
, który byłby dobry, ale celuję w 4.0 i 4.1, więc tego też nie można użyć.
ChildFragmentManager
jest dostępny tylko w 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Niestety, nie ma prawie żadnych dobrych przykładów pokazujących najlepsze praktyki dotyczące wykorzystania fragmentów bez biblioteki obsługi, nawet w całych przewodnikach programistów Androida; a zwłaszcza nic odnośnie zagnieżdżonych fragmentów.
Zastanawiam się więc: czy po prostu nie można pisać aplikacji 4.1 z zagnieżdżonymi fragmentami bez korzystania z biblioteki wsparcia i wszystkiego, co się z nią wiąże? (trzeba użyć FragmentActivity zamiast Fragment, itp.?) Albo jaka byłaby najlepsza praktyka?
Problem, który obecnie mam w trakcie opracowywania, to dokładnie to stwierdzenie:
Biblioteka obsługi systemu Android obsługuje teraz również zagnieżdżone fragmenty, dzięki czemu można wdrażać projekty zagnieżdżonych fragmentów w systemie Android 1.6 i nowszych.
Uwaga: nie możesz nadać układu fragmentowi, jeśli ten układ zawiera plik
<fragment>
. Zagnieżdżone fragmenty są obsługiwane tylko wtedy, gdy są dodawane do fragmentu dynamicznie.
Ponieważ umieściłem zdefiniowane zagnieżdżone fragmenty w XML, co najwyraźniej powoduje błąd typu:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
W tej chwili konkluzję dla siebie: nawet na 4.1, kiedy nie chcę nawet kierować na platformę 2.x, zagnieżdżone fragmenty, jak pokazano na zrzucie ekranu, nie są możliwe bez biblioteki obsługi.
(W rzeczywistości może to być bardziej wpis wiki niż pytanie, ale może ktoś inny zarządził tym wcześniej).
Aktualizacja:
Pomocna odpowiedź brzmi: Fragment Inside Fragment
źródło
ActionBar
(zbudowaną przez firmę Samsung). Przyjrzyj się bliżej ActionBarSherlock, ma zakładki w ActionBar, jeśli jest miejsce.Odpowiedzi:
Ograniczenia
Tak więc zagnieżdżanie fragmentów w innym fragmencie nie jest możliwe w XML, niezależnie od używanej wersji
FragmentManager
.Musisz więc dodawać fragmenty za pomocą kodu, może się to wydawać problemem, ale na dłuższą metę sprawia, że układy są superelastyczne.
Więc zagnieżdżanie bez użycia
getChildFragmentManger
? IstotąchildFragmentManager
jest to, że odracza ładowanie do czasu zakończenia poprzedniej transakcji fragmentowej. I oczywiście było to naturalnie obsługiwane tylko w 4.2 lub w bibliotece wsparcia.Zagnieżdżanie bez ChildManagera - rozwiązanie
Rozwiązanie, jasne! Robię to już od dłuższego czasu (od czasu
ViewPager
ogłoszenia).Zobacz poniżej; Jest to element
Fragment
opóźniający ładowanie, więcFragment
można go w nim załadować.Jest dość prosta,
Handler
jest naprawdę bardzo przydatną klasą, w rzeczywistości program obsługi czeka na wykonanie spacji w głównym wątku po zakończeniu zatwierdzania bieżącej transakcji fragmentu (ponieważ fragmenty zakłócają interfejs użytkownika, który uruchamiają w głównym wątku).Nie uważałbym tego za „najlepszą praktykę”, ale mam aplikacje na żywo korzystające z tego hacka i nie mam z tym jeszcze żadnych problemów.
Używam również tej metody do osadzania pagerów widoku - https://gist.github.com/chrisjenx/3405429
źródło
fragment
element, możesz zastąpić super implementację i spróbować samodzielnie ją przeanalizować / nadmuchać. Ale to będzie DUŻO wysiłku, cóż, poza zakresem pytania StackOverflow.Najlepszym sposobem, aby to zrobić w wersji przed API 17, jest nie robić tego wcale. Próba zaimplementowania tego zachowania spowoduje problemy. Nie oznacza to jednak, że nie można go przekonująco podrobić przy użyciu obecnego API 14. To, co zrobiłem, było następujące:
1 - spójrz na komunikację między fragmentami http://developer.android.com/training/basics/fragments/communicating.html
2 - Przenieś swój układ XML FrameLayout z istniejącego fragmentu do układu działania i ukryj go, podając wysokość 0:
3 - Zaimplementuj interfejs w fragmencie nadrzędnym
4 - Zaimplementuj interfejs w działaniu nadrzędnym
public class YourActivity extends Activity implementuje yourParentFragment.OnListener {
}
5 - Ciesz się, ta metoda zapewnia taką samą płynną funkcjonalność jak w przypadku funkcji getChildFragmentManager () w środowisku poprzedzającym API 17. Jak być może zauważyłeś, fragment podrzędny nie jest już tak naprawdę dzieckiem fragmentu nadrzędnego, ale teraz jest dzieckiem działania, naprawdę nie można tego uniknąć.
źródło
Musiałem sobie poradzić z tym dokładnie problemem ze względu na połączenie NavigationDrawer, TabHost i ViewPager, które powodowało komplikacje przy korzystaniu z biblioteki wsparcia z powodu TabHost. A potem musiałem również obsługiwać min API JellyBean 4.1, więc używanie zagnieżdżonych fragmentów z getChildFragmentManager nie było opcją.
Więc mój problem można wydestylować do ...
Moim rozwiązaniem było stworzenie iluzji zagnieżdżonych fragmentów bez faktycznego zagnieżdżania fragmentów. Zrobiłem to, wykorzystując główne działanie TabHost i ViewPager do zarządzania dwoma podobnymi widokami, których widocznością zarządza się przez przełączanie layout_weight między 0 a 1.
Dzięki temu mój fałszywy „Zagnieżdżony fragment” mógł działać jako niezależny widok, o ile ręcznie zarządzałem odpowiednimi wagami układu.
Oto moja activity_main.xml:
Zwróć uwagę, że „@ + id / pager” i „@ + id / container” są rodzeństwem z „android: layout_weight =„ 0.5 ”” i „android: layout_height =„ 0dp ””. Dzieje się tak, żebym mógł to zobaczyć w podglądzie dla dowolnego rozmiaru ekranu. W każdym razie ich wagi będą manipulowane w kodzie podczas działania.
źródło
SO
że używanieActionBar
zakładek z aNavigation Drawer
nie jest dobre, ponieważ automatycznie umieszcza zakładki nad widokiem twojej szuflady. Przepraszam, nie mam linku do wykonania kopii zapasowej.Opierając się na odpowiedzi @ Chris.Jenkins, jest to rozwiązanie, które działało dobrze dla mnie, do usuwania fragmentów podczas zdarzeń cyklu życia (które mają tendencję do rzucania wyjątków IllegalStateExceptions). Wykorzystuje to kombinację podejścia Handler i sprawdzenia Activity.isFinishing () (w przeciwnym razie zgłosi błąd „Nie można wykonać tej akcji po onSaveInstanceState).
Stosowanie:
źródło
Chociaż PO może mieć szczególne okoliczności, które uniemożliwiają mu korzystanie z Biblioteki wsparcia, większość ludzi powinna z niej korzystać. Dokumentacja Androida zaleca to, dzięki czemu Twoja aplikacja będzie dostępna dla jak najszerszego grona odbiorców.
W mojej pełniejszej odpowiedzi zrobiłem przykład demonstrujący, jak używać zagnieżdżonych fragmentów z biblioteką pomocniczą.
źródło