web-dev-qa-db-ja.com

CardViewはFrameLayoutの上に配置されますが、最初に宣言されます

最初のアイテムとしてCardViewをサポートし、2番目にTextViewをサポートする単純なFrameLayoutがあるので、TextViewはインフレートされたビューの上にある必要があります。これはLolipopより前のバージョンで機能しますが、21 +カードではレイアウトで最も重要な場所になります。なぜそうなのか、そしてこれを修正する方法は? RelativeLayoutでも同じです。レイアウト:

<?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

フレームレイアウト内でzオーダーが定義されていないことがわかっている限り、カードビュー内にテキストビューを追加するだけですが、最後にレイアウトされたビューは最後に描画する必要があります。

これはおそらく、Lollipopでのカードの表示がLollipopより前の境界線描画コードにフォールバックしているときの標高の使用に関係していると考えられます。

16
JohanShogun

誰かがここに来て、標高を設定するための解決策が彼らのために機能しない場合(私の場合、私がCardViewの上に画像を描く必要があり、それに影を付けることが受け入れられなかった場合)、あなたCardViewを別のFrameLayoutでラップすることで問題を解決できます。提供されている例では、次のようになります。

<?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

これは私のために働いた!

<?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

少し遅れてディスカッションに参加するかもしれませんが、CardViewの標高をあきらめる余裕がある場合は、XMLレイアウトでcardElevationCardViewプロパティを設定するだけです。 0dp

そのようです:

app:cardElevation="0dp"
7
Itamar