J'utilise un CardView comme élément dans un RecyclerView. Ce faisant Android génère automatiquement des marges entre le cardView et l'écran et entre les différents cardViews.
<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_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/galleryCardBGColor"
app:cardCornerRadius="2dp" >
<Android.support.v7.widget.RecyclerView
Android:id="@+id/my_recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:scrollbars="vertical" />
J'ai suivi les instructions du lien pour les intégrer dans mon projet: sing-recyclerview-and-cardview-in-Eclipse-adt
J'avais précédemment utilisé une disposition linéaire pour l'élément de liste:
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
Cela fonctionnait parfaitement bien, sans aucune marge entre les éléments de la liste. Je viens de placer la disposition linéaire à l'intérieur du cardView, ce qui a entraîné des marges supplémentaires.
La raison étant que je veux fournir des marges exactes à ces éléments, et toutes les marges que je fournis maintenant sont ajoutées à ces marges préexistantes. J'ai essayé de fournir des marges/marges nulles/négatives à l'élément cardView, mais rien de tout cela ne fonctionne.
Toute idée, je peux supprimer ces marges ou autrement savoir exactement combien de marge est ajoutée.
avez-vous vérifié s'il s'agit de marge ou de remplissage? (Options de développement/afficher les limites de la disposition)
CardView
ajoute un remplissage dans les plateformes pré-L pour dessiner des ombres. Dans L, sauf si vous définissez useCompatPadding=true
, il ne doit pas y avoir d'écart.
L'ajout de marges négatives (bien que ce soit laid) devrait fonctionner. Si ce n'est pas le cas, veuillez ajouter un peu plus de code sur la façon dont vous les ajoutez et comment vous configurez le RecyclerView
.
Ça a marché pour moi. Utilisation:
card_view:cardElevation="0dp"
card_view:cardMaxElevation="0dp"
Juste décrit dans la réponse de @yigit, le CardView ajoutera un remplissage par défaut pour dessiner son ombre avant Android L. La taille du remplissage est décrite dans le doc de CardView.
J'ai trouvé que le moyen d'effacer ce remplissage (également pour ajouter du remplissage pour le contenu) consiste à utiliser les attributs contentPaddingLeft (/ Right/Top/Bottom) de CardView.
Si vous souhaitez effacer le remplissage par défaut, vous pouvez définir le contentPadding sur la valeur moins. Si vous souhaitez ajouter un remplissage de contenu, définissez contentPadding sur la valeur souhaitée.
Dans mon cas, j'utilise ces codes pour effacer le remplissage par défaut:
card_view:contentPaddingLeft="-3dp"
card_view:contentPaddingRight="-3dp"
card_view:contentPaddingTop="-3dp"
card_view:contentPaddingBottom="-3dp"
J'ai essayé la réponse de @Shubham, mais une exception IllegalStateException est levée dans RadialGradient.Java avec le message "le rayon doit être> 0".
Utilisez ces deux balises ci-dessous:
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
ajouter card_view:cardPreventCornerOverlap="false"
à votre card
Cela ne fonctionne que si votre image a des coins arrondis
Eh bien, il semble qu'il existe un moyen beaucoup plus facile de le faire, sans deviner le rembourrage et tout:
card_view:cardPreventCornerOverlap="false"
ou en utilisant Java:
cardView.setPreventCornerOverlap(false)
Le commentaire de @ vj9 sous la question acceptée m'a aidé à calculer les décalages. Le partager ici, car cela pourrait aider quelqu'un d'autre:
public static int getVerticalCardViewOffset(Context context) {
Resources res = context.getResources();
int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
return (int) (elevation * 1.5 + (1 - Math.cos(45)) * radius);
}
public static int getHorizontalCardViewOffset(Context context) {
Resources res = context.getResources();
int elevation = res.getDimensionPixelSize(R.dimen.cardview_default_elevation);
int radius = res.getDimensionPixelSize(R.dimen.cardview_default_radius);
return (int) (elevation + (1 - Math.cos(45)) * radius);
}
utilisation
Android:adjustViewBounds="true"
sur la vue que vous voulez envelopper dans la vue de carte
Si vous n'avez pas besoin du rayon d'angle ou de l'élévation du niveau inférieur, pensez à utiliser FrameLayout
sur pré-Lollipop.
<include layout="@layout/card_view_compat" />
layout/card_view_compat
<merge
xmlns:Android="http://schemas.Android.com/apk/res/Android"
>
<FrameLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
>
<include layout="@layout/content" />
</FrameLayout>
</merge>
layout-v21/card_view_compat
<merge
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
>
<Android.support.v7.widget.CardView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:cardCornerRadius="3dp"
app:cardElevation="4dp"
>
<include layout="@layout/content" />
</Android.support.v7.widget.CardView>
</merge>
Je sais qu'il est tard mais j'espère que cela aidera quelqu'un
app:cardPreventCornerOverlap="false"
définir l'application: cardPreventCornerOverlap sur false fera l'affaire :)