Ich möchte die z-Reihenfolge der Ansichten eines RelativeLayout in Android definieren.
Ich weiß, dass ein Weg, dies zu tun, das Anrufen ist bringToFront
.
Gibt es einen besseren Weg, dies zu tun? Es wäre toll, wenn ich die z-Reihenfolge in der Layout-XML definieren könnte.
Antworten:
Am einfachsten ist es, auf die Reihenfolge zu achten, in der die Ansichten zu Ihrer XML-Datei hinzugefügt werden. Niedriger unten in der Datei bedeutet höher oben in der Z-Achse.
Bearbeiten: Dies ist hier und hier auf der Android-Entwicklerseite dokumentiert . (Danke @flightplanner)
quelle
Wenn Sie dies im Code tun möchten, können Sie dies tun
siehe docs
quelle
Bitte beachten Sie, dass Schaltflächen und andere Elemente in API 21 und höher eine hohe Höhe haben und daher die XML-Reihenfolge der Elemente unabhängig vom übergeordneten Layout ignorieren. Ich habe eine Weile gebraucht, um das herauszufinden.
quelle
In Android ab API-Ebene 21 erhalten Elemente in der Layoutdatei ihre Z-Reihenfolge sowohl anhand der Reihenfolge in der Datei, wie in der richtigen Antwort beschrieben, als auch anhand ihrer Höhe. Ein höherer Höhenwert bedeutet, dass das Element eine höhere Z-Reihenfolge erhält .
Dies kann manchmal zu Problemen führen, insbesondere bei Schaltflächen, die häufig über Elementen angezeigt werden, die gemäß der Reihenfolge des XML in der Z-Reihenfolge darunter liegen sollten. Um dies zu beheben, stellen Sie einfach
android:elevation
die Elemente in Ihrem Layout-XML so ein, dass sie der Z-Reihenfolge entsprechen, die Sie erreichen möchten.Wenn Sie eine Höhe eines Elements im Layout festlegen, wird ein Schatten geworfen. Wenn Sie diesen Effekt nicht möchten, können Sie den Schatten mit folgendem Code entfernen:
Ich habe keine Möglichkeit gefunden, den Schatten einer erhöhten Ansicht durch die Layout-XML zu entfernen.
quelle
android:elevation="1000dp"
. Auf diese Weise wird kein Schatten gerendert.Ich bin auf die gleichen Probleme gestoßen: In einem relativen Layout parentView habe ich zwei Kinder childView1 und childView2. Zuerst setze ich childView1 über childView2 und möchte, dass childView1 über childView2 liegt. Das Ändern der Reihenfolge der Ansichten von Kindern hat das Problem für mich nicht gelöst. Was für mich funktioniert hat, ist android: clipChildren = "false" in parentView und in dem von mir festgelegten Code zu setzen:
quelle
child.bringToFront()
mitparent.invalidate()
Werken, aberparent.bringChildToFront(child)
nicht. Wo ist die Logik, die wir alle von einem Betriebssystem erwarten?android:clipChildren="false"
hat es geschafft. Danke dir!Bitte beachten Sie, dass Sie
view.setZ(float)
ab API-Level 21 verwenden können. Hier finden Sie weitere Informationen.quelle
Ich dachte, ich würde seit der Einführung des eine Antwort hinzufügen
Das XML-Feld hat die Dinge ein wenig verändert. Die anderen Antworten, die das Laufen vorschlagen
sind absolut genau richtig, AUSSER, dass dieser Code childView1 NICHT vor eine Ansicht mit einem fest codierten android: translationZ in der XML-Datei bringt. Ich hatte Probleme damit und nachdem ich dieses Feld aus den anderen Ansichten entfernt hatte, funktionierte bringToFront () einwandfrei.
quelle
elevation
API 21 hat
view.setElevation(float)
build-inZur
ViewCompat.setElevation(view, float);
Abwärtskompatibilität verwendenWeitere Methoden
ViewCompat.setZ(v, pixels)
undViewCompat.setTranslationZ(v, pixels)
Auf andere Weise können Sie Schaltflächen sammeln oder ein Array anzeigen und
addView
zum Hinzufügen zu RelativeLayout verwendenquelle
childView.bringToFront () hat bei mir nicht funktioniert, daher habe ich die Z-Übersetzung des zuletzt hinzugefügten Elements (das alle anderen untergeordneten Elemente überlagert hat) auf einen negativen Wert wie folgt gesetzt:
lastView.setTranslationZ(-10);
Weitere Informationen finden Sie unter https://developer.android.com/reference/android/view/View.html#setTranslationZ(float)
quelle
Sie können benutzerdefinierte
RelativeLayout
mit neu definierten verwendenprotected int getChildDrawingOrder (int childCount, int i)
Beachten Sie, dass bei dieser Methode param
i
als "welche Ansicht soll ich zeichneni'th
" verwendet wird. SoViewPager
funktioniert es. Es legt die benutzerdefinierte Zeichenreihenfolge in Verbindung mit festPageTransformer
.quelle
Überprüfen Sie, ob in einer der Ansichten in XML eine Höhe vorhanden ist. Wenn ja, fügen Sie dem anderen Element eine Höhe hinzu oder entfernen Sie die Höhe, um das Problem zu beheben. Von dort aus ist es die Reihenfolge der Ansichten, die bestimmt, was über dem anderen steht.
quelle
Oder fügen Sie die überlappende Schaltfläche oder Ansichten in ein FrameLayout ein. Dann berücksichtigt das RelativeLayout in der XML-Datei die Reihenfolge der untergeordneten Layouts, die hinzugefügt wurden.
quelle
Sie können das folgende Codebeispiel auch verwenden, um dasselbe zu erreichen
Dies ist abwärtskompatibel. Hier
mCardView
ist eine Ansicht, die unten sein solltesourceView
.quelle