web-dev-qa-db-fra.com

Pourquoi il n'y a pas d'espace entre CardViews sur Lollipop?

J'essaie d'utiliser le CardView et il fonctionne bien en dessous de 5.0, mais a l'air étrange sur 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>

Je rencontre la même question lorsque j'utilise le RecyclerView, devrais-je ajouter quelque chose s'il fonctionne sur Lollipop?

78
cajsaiko

Définissez ceci sur un CardView:

app:cardUseCompatPadding="true"

De la documentation:

Ajoutez également un remplissage dans l’API v21 + afin d’avoir les mêmes mesures que les versions précédentes.

204
tomrozb

Utilisez ces deux balises ci-dessous à l'intérieur de votre cardview:

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

la première image est le comportement attendu de la vue de carte. lorsque la carte a une élévation, l’ombre tombe sur les couches inférieures. Dans les appareils pré-Lollipop, l’élévation est obtenue en ajoutant un rembourrage. les dispositifs pré-Lollipop auront donc un rembourrage autour de la vue de la carte.

Avant L, CardView ajoute un remplissage à son contenu et dessine des ombres dans cette zone. Ce montant de remplissage est égal à maxCardElevation + (1 - cos45) * cornerRadius sur les côtés et à maxCardElevation * 1,5 + (1 - cos45) * cornerRadius en haut et en bas.

12
null pointer

Vous devez ajouter app:cardUseCompatPadding="true" à votre Cardview. Mais juste ajouter que peut vous donner une erreur. Pour éviter cette erreur, vous devez également ajouter xmlns:app="http://schemas.Android.com/apk/res-auto" à votre CardView.

Par exemple,

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

Certains ajouteraient card_view:cardUseCompatPadding="true" et xmlns:card_view="http://schemas.Android.com/apk/res-auto" au lieu de ceux mentionnés ci-dessus. Les deux voies sont correctes.

Si vous voulez en savoir plus sur app en XML (Android), veuillez passer par ceci réponse :

Bien que les réponses précédentes résolvent le problème, ils n’ont pas expliqué le rôle de chaque attribut. Donc, pour être plus utile pour répondre aux demandeurs,

L'attribut cardPreventCornerOverlap ajoute un remplissage à CardView sous v20 et avant pour empêcher les intersections entre le contenu de la carte et les coins arrondis.

cardUseCompatPadding attribut ajoute un remplissage dans l'API v21 + ainsi que d'avoir les mêmes mesures avec les versions précédentes.

5
AnV