Android ConstraintLayout - Legen Sie eine Ansicht über eine andere Ansicht

105

Ich versuche, ein ProgressBarüber a hinzuzufügen Button(beide befinden sich in a ConstraintLayout).

<Button
    android:id="@+id/sign_in_button"
    android:layout_width="280dp"
    android:layout_height="75dp"
    android:layout_marginBottom="75dp"
    android:layout_marginTop="50dp"
    android:text="@string/sign_in"
    android:textColor="@color/white"
    android:textSize="22sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordEditText"
    app:layout_constraintVertical_bias="0.0"/>

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="@+id/sign_in_button"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="@+id/sign_in_button"
    android:layout_marginBottom="8dp"
    app:layout_constraintVertical_bias="0.5"
    android:layout_marginLeft="8dp"
    app:layout_constraintLeft_toLeftOf="@+id/sign_in_button"
    android:layout_marginRight="8dp"
    app:layout_constraintRight_toRightOf="@+id/sign_in_button"/>

Aber auch nach dem Aufruf bringToFrontdes ProgressBarIn onCreatebleibt es immer hinter dem Button.

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();
Adam Johns
quelle
Das ist so seltsam, dass ich versucht habe, ein bisschen mit Ihrem Layout zu spielen und sogar die Kette umzukehren, sodass der Fortschrittsbalken auf den Bearbeitungstext und die Schaltfläche auf den Fortschrittsbalken beschränkt ist, aber die Schaltfläche scheint immer über dem Fortschrittsbalken zu sein
Lelloman
Können Sie ein FrameLayout verwenden? Probieren Sie es aus und wissen Sie, dass in FrameLayout der Z-Index durch die Reihenfolge innerhalb des Layouts angegeben wird (also Button 1st, Progress 2nd)
razgraf
Wo ist dein passwordEditText, als ich ohne App überprüft habe: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" Ich kann den Fortschrittsbalken oben sehen. Kannst du das passwordEditText
Pavan

Antworten:

167

Stellen Sie eine Höhe auf die ProgressBar; 2dpscheint zu funktionieren.

android:elevation="2dp"

Sie können auch versuchen, translationZdie in der akzeptierten Antwort auf eine ähnliche Frage vorgeschlagenen Einstellungen vorzunehmen .

Ich bin auch auf diese Antwort als Alternative gestoßen.

Cheticamp
quelle
17
Aber elevationund translationZnur für API> = 21, was ist mit älteren APIs?
Q126y
1
@ q126y Ich glaube nicht, dass dies bis API 21 zu einem Problem wurde, daher sollten ältere APIs dies nicht benötigen. Ich habe es auf einem Emulator mit API 17 versucht und der Fortschrittsbalken wurde wie erwartet oben angezeigt.
Cheticamp
@Cheticamp also Wie gehe ich damit um? AS gibt eine Warnung aus, dass es nur API Level 21 und höher funktioniert.
Ajay S
6
@ q126yViewCompat.setTranslationZ(view, 5)
Silvia H
2
ViewCompat.setElavation(view, 20f)hilft dir
sagus_helgy
9

Wir müssen Android: Elevation verwenden, um dies zu kontrollieren.

android:elevation="10dp"

Dieses Höhenattribut funktioniert nur auf API-Ebene> = 21. Im Folgenden verhält es sich jedoch normal. Wenn wir unter der Schaltflächenansicht den Fortschritt hinzufügen, wird die Ansicht unten oben in der anderen Ansicht angezeigt.

Ishan Fernando
quelle
6

In den meisten Fällen können Sie einfach die Ansicht definieren, die oben nach der Ansicht angezeigt werden soll, die darunter angezeigt werden soll.

Cristan
quelle
Wie stellen Sie sicher, dass die XML versehentlich neu angeordnet werden kann
RamPrasadBismil
@Cristan, es ist besser, ein Code-Snippet oder ein Beispiel bereitzustellen. Danke
Blueware
1
Ich frage mich, warum ProgressBarnicht oben auf dem Button, obwohl ProgressBarnach Buttonin der Frage definiert wird.
Michael Osofsky
Ich dachte, dass dies auch wahr ist, aber egal, wo ich eine Bildansicht in der Reihenfolge des Einschränkungslayouts platziere, sie wird immer hinter einer Schaltfläche
angezeigt
0

Aktualisierte Antwort für Android Sutdio 3.5:

Im aktualisierten Layout-Editor können Sie jetzt viel einfacher auswählen, welche Ansicht angezeigt werden soll, wie in den Versionshinweisen zu Android Studio gezeigt

Außerdem hebt eine blaue Überlagerung jetzt das Ziel der Einschränkung hervor. Diese Hervorhebung ist besonders nützlich, wenn Sie versuchen, sich auf eine Komponente zu beschränken, die sich mit einer anderen überlappt.

https://developer.android.com/studio/releases

Noch einfacher: Wenn Sie die Ansicht nach oben ziehen (Kopieren, Einfügen oder aus dem Komponentenbaum im Layout-Editor), erhält sie eine niedrigere Priorität (also hinter den anderen Ansichten).

Refael
quelle
0

Im Constraint-Layout sollten Sie verwenden

traslationz

höher als die Ansicht, die Sie unten sehen möchten.

Waqas Yousaf
quelle
0

Sie können es wie folgt einwickeln. Verwenden Sie framelayout als übergeordnetes Element und platzieren Sie die Porogress-Leiste außerhalb des Einschränkungslayouts. Dies überlappt die Schaltfläche

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 //your all view inside it with button
 <Button/>......
  .........
 </androidx.constraintlayout.widget.ConstraintLayout>

 <ProgressBar
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</FrameLayout>
Rohan Sharma
quelle
0

Für die Schaltfläche ist standardmäßig TranslationZ festgelegt, sodass Sie zwei Optionen haben

1 - Fortschrittsbalken TranslationZ größer als die Tastenhöhe machen

ViewCompat.setTranslationZ(progressBar, 5)// to support older api <21

2 - Schalten Sie die Schaltfläche TranslateZ auf 0, damit die Ansichten in der Reihenfolge in Ihrem Einschränkungslayout übereinander angezeigt werden. Sie können dies erreichen, indem Sie den Stil auf die Schaltfläche setzen

style="@style/Widget.AppCompat.Button.Borderless"
Mohammed Alaa
quelle