13

ich denke, die Titel über mein Problem ziemlich explizit ist ... So, hier ist mein Layout:Android 5.0 - ProgressBar kann nicht über eine Schaltfläche angezeigt werden

  <RelativeLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 

       <Button 
        android:id="@+id/button_action" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="Login" /> 

       <ProgressBar 
        android:id="@+id/progress_bar" 
        android:layout_width="50dp" 
        android:layout_height="50dp" 
        android:layout_centerInParent="true"/> 

      </RelativeLayout> 

auf Android SDKs < 21, kein Problem, die ProgressBar wird korrekt über die Schaltfläche angezeigt und in der Schaltfläche zentriert. Aber auf Android 5.0 wird die ProgressBar hinter der Button angezeigt.

Sie können also sehen, dass es richtig positioniert ist, wenn Sie die Option "Layoutgrenzen anzeigen" in den Einstellungen der Entwickleroptionen aktivieren, aber Sie können nichts auf dem Bildschirm ohne diese Option sehen.

Würde jemand wissen, wie man das repariert? Ich denke, es ist eine Frage von Elevation vor kurzem eingeführt, aber ich weiß wirklich nicht, wie man sich darum kümmert. Für den Datensatz verwende ich den kürzlich veröffentlichten Theme.AppCompat-Stil von der support.v7.

EDIT:

Ich habe auch versucht setElevation(0) und setTranslationY(0) auf den Knopf programmatisch anzuwenden, aber es hat nichts zu ändern. Also frage ich mich, ob es mit der Erhebung zu tun hat.

Vielen Dank im Voraus Jungs

Mathieu

+0

Gibt es einen Grund, warum Sie nicht verwenden 'FrameLayout'? – Smileek

+0

Nein, nicht wirklich. Nur eine Frage der Angewohnheit, denke ich. Kann es etwas ändern? – MathieuMaree

+0

@ViewMa, ja. Bitte, schau dir meine Antwort an. – Smileek

Antwort

37

können Sie Android verwenden: translationZ Attribut in ProgressBar:

 <ProgressBar 
      android:id="@+id/progress_bar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:translationZ="2dp" 
      android:layout_centerInParent="true"/> 
+0

Danke für deine Antwort wpiwonski, aber nein, änderte nichts – MathieuMaree

+2

Es ist seltsam. Ich habe den Code auf Emulator überprüft und ProgressBar ist jetzt über den Button. 1 dp war nicht genug, aber 2 dp bewegte ProgressBar nach vorne. – wpiwonski

+1

Mein Fehler, ich habe versucht, die translationZ des Knopfes auf 0 zu setzen, anstatt die ProgressBars zu erhöhen. Es funktioniert in der Tat, danke! – MathieuMaree

-1

Wahrscheinlich ist der einfachste Weg, um die FrameLayout zu verwenden, da es Layouts machen erstellt wurde deren untergeordnete Sichten sind nach dem Z-Index geordnet:

<FrameLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" > 

      <Button 
       android:id="@+id/button_action" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="Login" /> 

      <ProgressBar 
       android:id="@+id/progress_bar" 
       android:layout_width="50dp" 
       android:layout_height="50dp" /> 
    </FrameLayout> 

Ich bin nicht sicher, wie Ihr Layout aussieht, also müssen Sie vielleicht mit android:layout_gravity spielen.

+7

konfrontiert Scheint nicht zu arbeiten, die ProgressBar ist immer noch hinter dem Button – MathieuMaree

+0

Sie sind fast wahr! Sie müssen Ihre Schaltflächenansicht in ein anderes frameLayout einbinden. Siehe meine Antwort. – Tobliug

3

Gleiche Frage ist hier gefragt, mit einer besseren Erklärung der Ausgabe:

https://stackoverflow.com/a/27216368/235910

zu zitieren @CommonsWare:

Das Problem Android 5.0 des erscheint elevation Eigenschaft. Anscheinend ist die Z-Achsen-Reihenfolge in elevation gebunden. Wenn beide Widgets dieselbe elevation haben, wird die RelativeLayout die Z-Achsen-Reihenfolge bestimmen - Sie können sehen, dass, wenn Sie Ihr Layout , beide Widgets, zum Beispiel sein sollten. Wenn jedoch ein Widget (Button) eine elevation hat und ein anderes Widget (ImageView) nicht hat, hat die elevation Vorrang.

können Sie die Buttonelevation über android:stateListAnimator="@null" oder durch defining your own custom animator entfernen.Sie können auch elevation zu Ihrem ImageView bis hinzufügen, damit es auf der Z-Achse höher liegt als der Button.

+0

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. –

+0

fair genug, bearbeitete die Antwort;) – LambergaR

0

Es ist besser, android: translationZ mehr als 2dp. Ihre Ansicht/Ihr Widget wird verschwinden, wenn Sie die Taste drücken. Ich erklärte den Grund here.

<!-- Elevation when button is pressed --> 
<dimen name="button_elevation_material">1dp</dimen> 
<!-- Z translation to apply when button is pressed --> 
<dimen name="button_pressed_z_material">2dp</dimen> 

Knopf haben diese beiden Werte und in der framework definiert.

2

Das gleiche Problem hier, mein einfacher "Hack" war auch den Button in ein anderes FrameLayout zu wickeln. So kann ich über die api-Version und andere Erhebung Problem nicht kümmern;)

<FrameLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" > 

     <FrameLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 
       <Button 
        android:id="@+id/button_action" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:text="Login" /> 
     </FrameLayout> 

     <ProgressBar 
      android:id="@+id/progress_bar" 
      android:layout_width="50dp" 
      android:layout_height="50dp" /> 
</FrameLayout>