web-dev-qa-db-fra.com

Comment définir le remplissage du widget CardView dans Android L

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

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: 

  1. Définissez le remplissage au moment de l'exécution à l'aide de View.setPadding() et veillez à régler les ombres (mais uniquement avant l'aperçu L!).
  2. Placez tout ce qui est à l'intérieur d'une mise en page qui spécifie un remplissage. 

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

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

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.

Exemple de code

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

Sources

[1] CardView.setUseCompatPadding (boolean)

[2] Android.support.v7.cardview: cardUseCompatPadding

28
Anonsage

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

0
O95

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.

0