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)
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źć.
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:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
myView.setOutlineProvider(null);
}
Nie znalazłem żadnego sposobu na usunięcie cienia podwyższonego widoku przez xml układu.
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:
childView1.bringToFront();
parentView.invalidate();
child.bringToFront()
z parent.invalidate()
uczynków, ale parent.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.
Myślałem, że dodam odpowiedź od czasu wprowadzenia
Android: translationZ
Pole XML zmieniło to trochę. Inne odpowiedzi sugerujące uruchomienie
childView1.bringToFront();
parentView.invalidate();
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.
elevation
API 21 ma view.setElevation(float)
wbudowane
Użyj ViewCompat.setElevation(view, float);
dla kompatybilności wstecznej
Wię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
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
Możesz użyć niestandardowego RelativeLayout
z przedefiniowaniem
protected int getChildDrawingOrder (int childCount, int i)
Uważaj - ta metoda przyjmuje param i
jako „który widok powinienem narysować i'th
”. Tak to ViewPager
działa. Ustawia niestandardową kolejność rysowania w połączeniu z PageTransformer
.
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.