webentwicklung-frage-antwort-db.com.de

Definieren der Z-Reihenfolge der Ansichten von RelativeLayout in Android

Ich möchte die z-Reihenfolge der Ansichten eines RelativeLayout in Android definieren.

Ich weiß, eine Möglichkeit, dies zu tun, ist der Aufruf von 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.

205
hpique

Am einfachsten ist es, einfach auf die Reihenfolge zu achten, in der die Ansichten zu Ihrer XML-Datei hinzugefügt werden. Ein niedrigerer Wert in der Datei bedeutet einen höheren Wert in der Z-Achse.

Bearbeiten: Dies ist auf der Android-Entwicklerseite hier und hier dokumentiert. (Danke @flightplanner)

293
Steve Haley

Wenn Sie dies im Code tun möchten, können Sie dies tun 

View.bringToFront();

siehe docs

84
QAMAR

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.

52
Daniel Wilson

Ich bin auf die gleichen Probleme gestoßen: In einem relativen Layout parentView habe ich 2 Kinder childView1 und childView2. Zuerst setze ich childView1 über childView2 und ich möchte, dass childView1 auf childView2 steht. Das Ändern der Reihenfolge der Kindersichten hat das Problem für mich nicht gelöst. Was für mich funktionierte, war das Setzen von Android: clipChildren = "false" in parentView und im Code, den ich eingestellt habe:

childView1.bringToFront();

parentView.invalidate();
13
Tony Vu

In Android ab API-Ebene 21 erhalten Elemente in der Layout-Datei ihre Z-Reihenfolge, sowohl wie sie in der Datei angeordnet sind, wie in der richtigen Antwort beschrieben, als auch von ihrer Höhe, ein höherer Höhenwert bedeutet, dass der Artikel 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 entsprechend der Reihenfolge des XML in Z-Reihenfolge darunter sein sollten. Um dies zu beheben, setzen Sie einfach den Android:elevation der Elemente in Ihrem Layout-XML auf die Z-Reihenfolge, die Sie erreichen möchten.

Wenn Sie im Layout eine Höhe eines Elements festlegen, wirft es einen Schatten. Wenn Sie diesen Effekt nicht wünschen, können Sie den Schatten mit Code wie folgt entfernen: 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
   myView.setOutlineProvider(null);
}

Ich habe keine Möglichkeit gefunden, den Schatten einer erhöhten Ansicht durch die Layout-XML zu entfernen.

13
lejonl

Bitte beachten Sie, dass Sie view.setZ(float) ab API Level 21 verwenden können. Hier finden Sie weitere Informationen.

12
Vadim Kotov

Ich dachte, ich würde eine Antwort hinzufügen, seit der 

Android: ÜbersetzungZ

Das XML-Feld hat die Dinge ein bisschen geändert. Die anderen Antworten, die das Laufen vorschlagen

childView1.bringToFront();

parentView.invalidate();

bei EXCEPT ist der Punkt genau richtig, dass dieser Code childView1 NICHT mit einer fest codierten Android-Version: translationZ in der XML-Datei vor jede Ansicht bringt. Ich hatte Probleme damit und nachdem ich dieses Feld aus den anderen Ansichten entfernt hatte, funktionierte bringToFront () einwandfrei.

11
ThePartyTurtle

API 21 hat ein view.setElevation(float)-Build-In

Verwenden Sie ViewCompat.setElevation(view, float); für die Abwärtskompatibilität

Weitere Methoden ViewCompat.setZ(v, pixels) und ViewCompat.setTranslationZ(v, pixels)

Eine andere Möglichkeit, Schaltflächen oder Ansichts-Arrays zu sammeln und addView zu RelativeLayout hinzuzufügen

5
Qamar

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 gesetzt:

lastView.setTranslationZ(-10);

weitere Informationen finden Sie unter https://developer.Android.com/reference/Android/view/View.html#setTranslationZ (float)

3
kip2

Sie können benutzerdefinierte RelativeLayout mit neu definiertem verwenden

protected int getChildDrawingOrder (int childCount, int i)

Seien Sie sich bewusst, dass für diese Methode param i als "Welche Ansicht soll ich i'th zeichnen" .. __ benannt werden. So funktioniert ViewPager. Es legt die benutzerdefinierte Zeichenreihenfolge in Verbindung mit PageTransformer fest.

1
Petrov Dmitrii

Prüfen Sie, ob Sie eine der Ansichten in XML angehoben haben. Wenn dies der Fall ist, fügen Sie dem anderen Element eine Höhe hinzu oder entfernen Sie die Höhe, um das Problem zu lösen. Von dort aus bestimmt die Reihenfolge der Ansichten, was über dem anderen steht.

0

Sie können das folgende Codebeispiel auch verwenden, um dies zu erreichen

ViewCompat.setElevation(sourceView, ViewCompat.getElevation(mCardView)+1);

Dies ist abwärtskompatibel. Hier ist mCardView eine Ansicht, die unter sourceView liegen sollte.

0
Ankit

Oder fügen Sie die überlappenden Schaltflächen oder Ansichten in ein FrameLayout ein. Das RelativeLayout in der XML-Datei berücksichtigt dann die Reihenfolge der untergeordneten Layouts, wenn diese hinzugefügt werden.

0
fullMoon