web-dev-qa-db-fra.com

CardView va au-dessus de FrameLayout, mais déclaré en premier

J'ai FrameLayout simple avec le support CardView comme premier élément, et TextView comme deuxième, donc TextView doit être au-dessus de la vue gonflée. Cela fonctionne sur pré-Lolipop mais sur les cartes 21+, la place est la plus importante dans la mise en page, pourquoi en est-il ainsi et comment y remédier? Même chose avec RelativeLayout. Disposition:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <Android.support.v7.widget.CardView
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:layout_margin="20dp"
        app:cardBackgroundColor="#ff0000"
        app:cardUseCompatPadding="false"
        />

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:text="i am top view!"
        Android:gravity="center"
        Android:layout_gravity="center"
        Android:textSize="30sp"
        Android:textAllCaps="true"
        Android:textColor="#00ff00"
        Android:background="#0000ff"
        />

</FrameLayout>
28
Konstantin Berkov

Ajoutez simplement votre affichage de texte à l'intérieur de l'affichage de la carte, pour autant que je sache, l'ordre z n'est pas défini à l'intérieur d'une disposition de cadre, mais la dernière vue présentée doit être dessinée en dernier.

Cela a probablement à voir avec le fait que les vues de carte dans Lollipop utilisent l'élévation alors qu'elles se rabattent sur le code de dessin de bordure avant Lollipop.

16
JohanShogun

Si quelqu'un arrive ici et que la solution pour définir l'élévation ne fonctionne pas pour eux (comme dans mon cas, où je devais dessiner une image au-dessus de CardView et avoir une ombre dessus n'était pas acceptable), vous peut résoudre le problème en enveloppant le CardView dans un autre FrameLayout. Dans l'exemple fourni, cela ressemblerait à ceci:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <!-- This is the added FrameLayout -->
    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.CardView
            Android:layout_width="match_parent"
            Android:layout_height="200dp"
            Android:layout_margin="20dp"
            app:cardBackgroundColor="#ff0000"
            app:cardUseCompatPadding="false"
            />

    </FrameLayout>

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:text="i am top view!"
        Android:gravity="center"
        Android:layout_gravity="center"
        Android:textSize="30sp"
        Android:textAllCaps="true"
        Android:textColor="#00ff00"
        Android:background="#0000ff"
        />

</FrameLayout>
43
Ereza

Cela a fonctionné pour moi!

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <!-- Add this layout as parent of CardView -->
    <LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.CardView
            Android:layout_width="match_parent"
            Android:layout_height="200dp"
            Android:layout_margin="20dp"
            app:cardBackgroundColor="#ff0000"
            app:cardUseCompatPadding="false" />

    </LinearLayout>
    <!--Close parent layout-->

    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="100dp"
        Android:layout_gravity="center"
        Android:background="#0000ff"
        Android:gravity="center"
        Android:text="i am top view!"
        Android:textAllCaps="true"
        Android:textColor="#00ff00"
        Android:textSize="30sp" />

</FrameLayout>
8
Bikram

Je vais peut-être rejoindre la discussion un peu tard, mais si vous pouvez vous permettre d'abandonner l'élévation de CardView, vous pouvez simplement définir la propriété cardElevation de CardView dans votre mise en page XML à 0dp.

Ainsi:

app:cardElevation="0dp"
7
Itamar