Chciałbym zdefiniować kolejność Z widoków RelativeLayout w Androidzie.
Wiem, że jednym ze sposobów jest dzwonienie bringToFront
.
Czy jest na to lepszy sposób? Byłoby wspaniale, gdybym mógł zdefiniować kolejność Z w xml układu.
Chciałbym zdefiniować kolejność Z widoków RelativeLayout w Androidzie.
Wiem, że jednym ze sposobów jest dzwonienie bringToFront
.
Czy jest na to lepszy sposób? Byłoby wspaniale, gdybym mógł zdefiniować kolejność Z w xml układu.
Odpowiedzi:
Najprostszym sposobem jest zwrócenie uwagi na kolejność dodawania widoków do pliku XML. Niższe w pliku oznacza wyżej w osi Z.
Edycja: jest to udokumentowane tu i tutaj na stronie programisty Androida. (Dzięki @flightplanner)
źródło
Jeśli chcesz to zrobić w kodzie, możesz to zrobić
zobacz dokumenty
źródło
Uwaga: przyciski i inne elementy w API 21 i nowszych mają wysokie rzędne, dlatego ignorują kolejność elementów w xml bez względu na układ nadrzędny. Zajęło mi trochę czasu, żeby to rozgryźć.
źródło
W systemie Android, począwszy od interfejsu API poziomu 21, elementy w pliku układu uzyskują swoją kolejność Z zarówno od sposobu, w jaki są uporządkowane w pliku, jak opisano w prawidłowej odpowiedzi, a od ich rzędnej wyższa wartość rzędnej oznacza, że element otrzymuje wyższą kolejność Z .
Może to czasem powodować problemy, szczególnie w przypadku przycisków, które często pojawiają się nad elementami, które zgodnie z kolejnością XML powinny znajdować się poniżej nich w kolejności Z. Aby to naprawić, po prostu ustaw
android:elevation
elementy w swoim układzie XML, aby pasowały do kolejności Z, którą chcesz osiągnąć.Jeśli ustawisz rzędną elementu w układzie, zacznie on rzucać cień. Jeśli nie chcesz tego efektu, możesz usunąć cień za pomocą kodu:
Nie znalazłem żadnego sposobu na usunięcie cienia podwyższonego widoku przez xml układu.
źródło
android:elevation="1000dp"
. W ten sposób nie jest renderowany cień.Napotkałem te same problemy: w układzie względnym parentView mam 2 dzieci childView1 i childView2. Na początku umieszczam childView1 nad childView2 i chcę, aby childView1 był na szczycie childView2. Zmiana kolejności widoków dzieci nie rozwiązała problemu. Dla mnie zadziałało ustawienie androida: clipChildren = "false" na parentView oraz w ustawionym przeze mnie kodzie:
źródło
child.bringToFront()
zparent.invalidate()
uczynków, aleparent.bringChildToFront(child)
tego nie robi. Gdzie jest logika, której wszyscy oczekujemy od systemu operacyjnego?android:clipChildren="false"
załatwił sprawę. Dziękuję Ci!Pamiętaj, że możesz używać,
view.setZ(float)
zaczynając od poziomu API 21. Tutaj znajdziesz więcej informacji.źródło
Myślałem, że dodam odpowiedź od czasu wprowadzenia
Pole XML zmieniło to trochę. Inne odpowiedzi sugerujące uruchomienie
są całkowicie WYJĄTKOWE, ponieważ ten kod NIE spowoduje wyświetlenia childView1 przed jakimkolwiek widokiem za pomocą wbudowanego Androida: translationZ w pliku XML. Miałem z tym problemy i kiedy usunąłem to pole z innych widoków, bringToFront () działało dobrze.
źródło
elevation
API 21 ma
view.setElevation(float)
wbudowaneUżyj
ViewCompat.setElevation(view, float);
dla kompatybilności wstecznejWięcej metod
ViewCompat.setZ(v, pixels)
iViewCompat.setTranslationZ(v, pixels)
Innym sposobem jest zbieranie przycisków lub wyświetlanie tablicy i używanie ich
addView
do dodawania do RelativeLayoutźródło
childView.bringToFront () nie działało dla mnie, więc ustawiłem tłumaczenie Z ostatnio dodanego elementu (tego, który nakładał wszystkie pozostałe dzieci) na wartość ujemną, taką jak:
lastView.setTranslationZ(-10);
zobacz https://developer.android.com/reference/android/view/View.html#setTranslationZ(float) dla bardziej
źródło
Możesz użyć niestandardowego
RelativeLayout
z przedefiniowaniemprotected int getChildDrawingOrder (int childCount, int i)
Uważaj - ta metoda przyjmuje param
i
jako „który widok powinienem narysowaći'th
”. Tak toViewPager
działa. Ustawia niestandardową kolejność rysowania w połączeniu zPageTransformer
.źródło
Sprawdź, czy masz jakąkolwiek rzędną w jednym z widoków w XML. Jeśli tak, dodaj elewację do drugiego elementu lub usuń elewację, aby rozwiązać problem. Stamtąd kolejność poglądów decyduje o tym, co stoi ponad innymi.
źródło
Lub umieść nakładający się przycisk lub widoki wewnątrz FrameLayout. Następnie RelativeLayout w pliku xml będzie przestrzegać kolejności układów potomnych podczas dodawania.
źródło
Możesz użyć poniższego kodu również do osiągnięcia tego samego
Jest to kompatybilne wstecz. Oto
mCardView
widok, który powinien być poniżejsourceView
.źródło