web-dev-qa-db-ja.com

LollipopのCardView間にスペースがないのはなぜですか?

CardViewを使用しようとしましたが、5.0より下ではうまく動作しますが、Lollipopでは奇妙に見えます。

enter image description here

enter image description here

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:paddingBottom="@dimen/activity_vertical_margin"
Android:paddingLeft="@dimen/activity_horizontal_margin"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="@dimen/activity_vertical_margin">

<Android.support.v7.widget.CardView Android:layout_width="match_parent"
    Android:layout_height="200dp">
    <TextView
        Android:id="@+id/textView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="card1"
        Android:textAppearance="?android:attr/textAppearanceLarge" />
</Android.support.v7.widget.CardView>
<Android.support.v7.widget.CardView Android:layout_width="match_parent"
    Android:layout_height="200dp">

    <TextView
        Android:id="@+id/textView2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="card2"
        Android:textAppearance="?android:attr/textAppearanceLarge" />
</Android.support.v7.widget.CardView>
</LinearLayout>

RecyclerViewを使用するときに同じ質問に答えますが、Lollipopで実行する場合は何かを追加する必要がありますか?

78
cajsaiko

これをCardViewに設定します:

app:cardUseCompatPadding="true"

ドキュメントから:

API v21 +にもパディングを追加して、以前のバージョンと同じ測定値を取得します。

204
tomrozb

カードビュー内で次の2つのタグを使用します。

app:cardPreventCornerOverlap="false"
app:cardUseCompatPadding="true"
29

最初の画像は、カードビューの予想される動作です。カードに標高がある場合、影は最下層に落ちます。 Lollipop以前のデバイスでは、パディングを追加することで標高が作成されます。そのため、Lollipop以前のデバイスでは、カードビューの周りにパディングがあります。

Lの前に、CardViewはそのコンテンツにパディングを追加し、その領域に影を描きます。このパディング量は、maxCardElevation +(1-cos45)*側面のcornerRadiusとmaxCardElevation * 1.5 +(1-cos45)*上下のcornerRadiusに等しくなります。

12
null pointer

app:cardUseCompatPadding="true"Cardviewに追加する必要があります。ただし、追加するだけでエラーが発生する場合があります。このエラーを回避するには、xmlns:app="http://schemas.Android.com/apk/res-auto"CardViewに追加する必要もあります。

例えば、

<Android.support.v7.widget.CardView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    app:cardUseCompatPadding="true">

    // Other views here

</Android.support.v7.widget.CardView>

上記の代わりにcard_view:cardUseCompatPadding="true"xmlns:card_view="http://schemas.Android.com/apk/res-auto"を追加する人もいます。どちらの方法も正しいです。

XML(Android)のappについて詳しく知りたい場合は、この answer をご覧ください。

以前の回答で問題は解決しますが、各属性の機能については説明しませんでした。そのため、求職者の回答に役立つように、

cardPreventCornerOverlap属性は、v20以前のCardViewにパディングを追加して、カードコンテンツと丸い角の交差を防ぎます。

cardUseCompatPadding属性は、API v21 +のパディングも追加して、以前のバージョンと同じ測定値を取得します。

5
AnV