<merge/>
jest przydatny, ponieważ może pozbyć się niepotrzebnych grup ViewGroup, tj. układów, które są po prostu używane do zawijania innych widoków i same w sobie nie służą.
Na przykład, jeśli przejdziesz do <include/>
układu z innego pliku bez użycia scalania, dwa pliki mogą wyglądać mniej więcej tak:
layout1.xml:
<FrameLayout>
<include layout="@layout/layout2"/>
</FrameLayout>
layout2.xml:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
co jest funkcjonalnie równoważne z tym pojedynczym układem:
<FrameLayout>
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
</FrameLayout>
FrameLayout w layout2.xml może nie być przydatny. <merge/>
pomaga się go pozbyć. Oto jak to wygląda przy użyciu scalania (layout1.xml nie zmienia się):
layout2.xml:
<merge>
<TextView />
<TextView />
</merge>
Jest to funkcjonalnie równoważne z tym układem:
<FrameLayout>
<TextView />
<TextView />
</FrameLayout>
ale ponieważ używasz <include/>
, możesz ponownie użyć układu w innym miejscu. Nie trzeba go zastępować tylko FrameLayouts - możesz go użyć do zastąpienia dowolnego układu, który nie dodaje niczego użytecznego do wyglądu / zachowania twojego widoku.
<TextView />
, nic więcej.Tag dołączania
<include>
Tag pozwala dzielić swój układ na wiele plików: pomaga do czynienia ze skomplikowanym lub zbyt długie interfejsu użytkownika.Załóżmy, że podzieliłeś swój złożony układ za pomocą dwóch plików dołączanych w następujący sposób:
top_level_activity.xml :
Następnie musisz napisać
include1.xml
iinclude2.xml
.Należy pamiętać, że plik XML z plików dołączanych jest po prostu zrzucany w
top_level_activity
układzie podczas renderowania (podobnie jak#INCLUDE
makro dla C).Pliki dołączane to zwykły układ jane xml.
include1.xml :
... i dołącz plik 2.xml :
Widzieć? Nic fajnego. Pamiętaj, że nadal musisz zadeklarować przestrzeń nazw Androida
xmlns:android="http://schemas.android.com/apk/res/android
.Więc wygenerowana wersja top_level_activity.xml jest:
W kodzie java wszystko to jest przezroczyste:
findViewById(R.id.textView1)
w twojej klasie aktywności zwraca poprawny widget (nawet jeśli ten widget został zadeklarowany w pliku xml innym niż układ aktywności).A wisienka na górze: edytor wizualny radzi sobie z tym płynnie. Układ najwyższego poziomu jest renderowany z dołączonym plikiem XML.
Fabuła gęstnieje
Ponieważ plik dołączany jest plikiem XML w klasycznym układzie, oznacza to, że musi mieć jeden górny element. Jeśli więc plik musi zawierać więcej niż jeden widżet, musisz użyć układu.
Powiedzmy, że
include1.xml
teraz są dwaTextView
: należy zadeklarować układ. WybierzmyLinearLayout
.include1.xml :
Plik top_level_activity.xml będzie renderowany jako:
Ale poczekaj dwa poziomy
LinearLayout
są zbędne !Rzeczywiście, dwa zagnieżdżone
LinearLayout
nie służą żadnemu celowi, ponieważ dwaTextView
mogą być uwzględnionelayout1
dla dokładnie tego samego renderowania .Więc co możemy zrobić?
Wpisz tag scalania
<merge>
Tag tag tylko manekin, który stanowi element najwyższego poziomu do czynienia z tego rodzaju zagadnień związanych ze zwolnieniem.Teraz include1.xml staje się:
a teraz top_level_activity.xml jest renderowany jako:
Zapisałeś jeden poziom hierarchii, unikaj jednego niepotrzebnego widoku: Romain Guy już lepiej śpi.
Nie jesteś teraz szczęśliwszy?
źródło
RelativeLayout
lub narysować widoki ręcznieblazeroni już to wyjaśnił, chcę tylko dodać kilka punktów.
<merge>
służy do optymalizacji układów i służy do ograniczania niepotrzebnego zagnieżdżania.<merge>
dodaniu układu zawierającego znacznik do innego układu<merge>
węzeł jest usuwany, a jego widok potomny jest dodawany bezpośrednio do nowego elementu nadrzędnego.źródło
Aby uzyskać bardziej dogłębną wiedzę o tym, co się dzieje, stworzyłem następujący przykład. Zobacz pliki activity_main.xml i content_profile.xml .
Activity_main.xml
content_profile.xml
Tutaj cały plik układu po napompowaniu wygląda tak.
Sprawdź, czy w nadrzędnym LinearLayout znajduje się LinearLayout, który nie służy żadnemu celowi i jest zbędny. Spojrzenie na układ za pomocą narzędzia Layout Inspector wyraźnie to wyjaśnia.
content_profile.xml po zaktualizowaniu kodu w celu użycia scalania zamiast ViewGroup, takiego jak LinearLayout.
Teraz nasz układ wygląda tak
Widzimy tutaj, że nadmiarowa grupa LinearLayout ViewGroup została usunięta. Teraz narzędzie Inspektor układu daje następującą hierarchię układu.
Dlatego zawsze staraj się używać scalania, gdy układ nadrzędny może pozycjonować układy podrzędne, a dokładniej użyj scalania, gdy zrozumiesz, że w hierarchii będzie nadmiarowa grupa widoków.
źródło
Innym powodem użycia scalania jest użycie niestandardowych grup widoków w ListViews lub GridViews. Zamiast używać wzorca viewHolder w adapterze listy, można użyć widoku niestandardowego. Widok niestandardowy nadmuchałby plik XML, którego katalog główny jest znacznikiem scalającym. Kod adaptera:
oto niestandardowa grupa widokowa:
a oto XML:
źródło