J'utilise Android:paddingLeft
et Android:paddingTop
pour définir le remplissage du nouveau widget CardView
, mais cela ne fonctionne pas.
Je peux définir la marge pour tous les contrôles à l'intérieur de la CardView
comme solution de contournement, mais cela pose un problème s'il y a trop de contrôles.
Comment définir le remplissage pour le nouveau widget cardview?
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view"
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="200dp"
Android:paddingLeft="20dp"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="20dp"
Android:paddingBottom="@dimen/activity_vertical_margin"
card_view:cardCornerRadius="2dp">
<TextView
Android:id="@+id/info_text"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Hello World!"/>
</Android.support.v7.widget.CardView>
CardView avant L-preview utilise RoundRectDrawableWithShadow
pour dessiner son arrière-plan, qui remplace Drawable.getPadding()
pour ajouter un remplissage d'ombre. L'arrière-plan de la vue est défini via le code après inflation, qui remplace tout remplissage spécifié en XML.
Vous avez deux options:
View.setPadding()
et veillez à régler les ombres (mais uniquement avant l'aperçu L!).La dernière option est la plus sûre.
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view"
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="200dp"
card_view:cardCornerRadius="2dp">
<FrameLayout
Android:paddingLeft="20dp"
Android:paddingRight="@dimen/activity_horizontal_margin"
Android:paddingTop="20dp"
Android:paddingBottom="@dimen/activity_vertical_margin">
<TextView
Android:id="@+id/info_text"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Hello World!"/>
</FrameLayout>
</Android.support.v7.widget.CardView>
CardView doit gérer cela en utilisant les attributs contentPadding
fournis avec :
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/card_view"
Android:layout_gravity="center"
Android:layout_width="match_parent"
Android:layout_height="200dp"
card_view:cardCornerRadius="2dp"
card_view:contentPaddingLeft="20dp"
card_view:contentPaddingRight="@dimen/activity_horizontal_margin"
card_view:contentPaddingTop="20dp"
card_view:contentPaddingBottom="@dimen/activity_vertical_margin">
<TextView
Android:id="@+id/info_text"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Hello World!"/>
</Android.support.v7.widget.CardView>
Si vous souhaitez utiliser le remplissage CardView sur des périphériques antérieurs à la version L et le rendre identique sur les périphériques Lollipop +, vous devez utiliser setUseCompatPadding(true)
ou la variante XML cardUseCompatPadding="true"
.
En effet, "CardView ajoute un rembourrage supplémentaire pour dessiner des ombres sur les plates-formes avant L." [1] Ainsi, les différentes versions de l'API implémentées par défaut ont une apparence différente et les vues peuvent ne pas s'aligner correctement. Ainsi, le moyen le plus simple de résoudre ce problème consiste à utiliser les moyens indiqués ci-dessus ou à utiliser des marges à la place.
<Android.support.v7.widget.CardView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_context"
card_view:cardUseCompatPadding="true"
card_view:contentPadding="8dp"
card_view:cardCornerRadius="4dp" >
...
</Android.support.v7.widget.CardView>
Je suis venu ici pour chercher une solution permettant de définir le rembourrage de CardView dans styles.xml, car Android:padding
ne fonctionnait pas. (Je sais que ce n’est pas ce que l’opérateur demandait, mais je pense que c’est assez lié)
Dans styles.xml, le remplissage peut être défini simplement à l'aide de contentPadding
<style name="myCardViewStyle" parent="CardView">
<item name="contentPadding">20dp</item>
Cette solution permet de définir l'attribut de style de remplissage de CardView dans styles.xml
C’est ce qui a fonctionné pour moi: mettre chaque élément dans une disposition de cadre.
<FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginBottom="-4dp">
<Android.support.v7.widget.CardView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:background="@color/white_three"
Android:orientation="vertical"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="@dimen/card_elevation"
card_view:cardMaxElevation="0dp"
card_view:cardPreventCornerOverlap="false"
card_view:cardUseCompatPadding="true"
</Android.support.v7.widget.CardView>
Vérifiez bien que card_view est " http://schemas.Android.com/apk/res-auto " et non des outils, et définissez également des marges négatives sur la vue du cadre pour conserver les ombres - fonctionne très bien.