2015-01-23 4 views
11

Das Schaltflächenwidget wird unabhängig von der Layoutstruktur auf ein anderes Widget gezogen. Es wiederholt sich in RelativeLayout und FrameLayout, wenn das Material Dark/Light-Thema angewendet wird. Schau dir die Screenshots unten an, um dieses seltsame Verhalten besser zu veranschaulichen.Falsche Renderreihenfolge für Schaltfläche, wenn das Materialthema angewendet wird

Geprüft auf Nexus 4 und Nexus 5. Allerdings bezweifle ich, dass es zu Geräten verwandt ist.

How it looks in Android Studio

How it looks on my Nexus 4

+0

Ich habe auch bemerkt, dass Unentschieden, um in einigen Situationen nach unten oben ist es nicht. – holtaf

Antwort

8

Android 5.0 Lollipop zusammen mit Material Design eingeführt neue Eigenschaft die Höhe (Z-Index) von Widgets angeben. Es wird here beschrieben.

Um die Ansicht auf die Schaltfläche ziehen Sie android:elevation="1dp" zum View

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Don't look so deep" 
    /> 
<View 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#C00" 
    android:elevation="1dp" 
    /> 

Nach Teil der früheren Antwort auf falsch verstandenen Frage ist, gehalten für zukünftige Referenz

Mit RelativeLayout hinzufügen Sie müssen die Position der Elemente relativ zu anderen Elementen angeben.

So sagen Sie den View unter der Schaltfläche haben möchten, müssen Sie ids auf die Elemente hinzufügen müssen, und geben Sie, dass die Ansicht unterhalb der Schaltfläche ist:

<Button 
    android:id="+id/myactivity_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Don't look so deep" 
    /> 
<View 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#C00" 
    android:layout_below="@id/myactivity_button" 
    /> 

Schauen Sie sich die Android Developer Guide for RelativeLayout und die available LayoutParameters for RelativeLayouts


FrameLayout ist normalerweise nicht gut für die Organisation mehrerer Komponenten. Das FrameLayout dient dazu, einen Bereich auf dem Bildschirm auszublenden, um ein einzelnes Objekt anzuzeigen. Die Position der FrameLayout-Childs kann mithilfe des Attributs android:layout_gravity gesteuert werden.

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="top" 
    android:text="Don't look so deep" 
    /> 
<View 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#C00" 
    android:layout_gravity="bottom" 
    /> 

Überprüfen Sie die Android docs for FrameLayout und die available parameters for the layout_gravity

+3

Diese Antwort hat nichts mit der Antwort zu tun ... – holtaf

+0

@holtaf: Sie können aus seinem Beispiel sehen, dass er relative Layout verwendet. Wenn er die Layout-Optionen für die Widgets nicht angibt, werden sie alle übereinander gezeichnet. Daher ist die Lösung des Problems (so wie ich es verstehe), die Layout-Optionen zu seinem Layout-XML hinzuzufügen. – arnfada

+1

Ja, sie werden übereinander zeichnen, das ist nicht das Problem, das Problem ist ihre Zeichenreihenfolge. Sie nehmen an, von oben nach unten zu zeichnen, aber sie ziehen von unten nach oben. – holtaf

0

Von Lollipop (API 21) ab, gilt Android Elevation/Z Animation auf Tasten standardmäßig. Um dies zu vermeiden, fügen Sie Ihrem Button-XML Folgendes hinzu:

Dadurch wird die Schaltfläche ihren Z-Index einhalten.

Source

Verwandte Themen