web-dev-qa-db-fra.com

Le remplissage n'affecte pas <shape> dans une disposition XML

J'essaie de définir le remplissage dans un <shape> déclaré dans un fichier/une présentation XML. Mais quoi que je définisse, rien ne change concernant le rembourrage. Si je modifie d'autres propriétés, je vois les effets sur l'interface utilisateur. Mais cela ne fonctionne pas avec le rembourrage. Pourriez-vous nous indiquer les raisons possibles pour lesquelles cela pourrait se produire?

Voici la forme XML que j'essaie de styliser:

 <shape xmlns:Android="http://schemas.Android.com/apk/res/Android" 
      Android:shape="rectangle">

    <stroke Android:width="1dp" 
            Android:color="#ffffff" 
            Android:dashWidth="2dp"/>

    <solid Android:color="@color/button_white_cover"/>

    <corners Android:radius="11dp"/>

    <padding Android:left="1dp" 
             Android:top="20dp"
             Android:right="20dp" 
             Android:bottom="2dp"/>
 </shape>
72
Lyubomyr Dutko

J'ai enfin résolu mon problème de rembourrage.

Le rembourrage n'aura donc aucun effet sur la forme. Au lieu de cela, vous devrez appliquer un rembourrage dans un autre dessinable qui l'utilisera. Donc, j'ai un dessinable qui utilise la forme et là je fais:

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
   <item Android:drawable="@drawable/shape_below"/>
   <item Android:top="10px" Android:right="10px" Android:drawable="@drawable/shape_cover"/>
</layer-list>

Donc, comme vous pouvez le voir dans la deuxième <item>- élément J'ai défini le remplissage (en haut et à droite). Et après cela, tout fonctionne.

Merci.

103
Lyubomyr Dutko

Comme deux ou trois commentaires l'ont fait allusion, la meilleure approche consiste à envelopper le <shape> dans un <item> élément et définissez le remplissage à la place. Il existe cependant d'autres options disponibles qui sont détaillées dans le lien ci-dessous. par exemple

<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
        Android:left="8dp"
        Android:right="8dp"
        Android:top="8dp"
        Android:bottom="8dp">

        <shape Android:shape="rectangle">
            ...
        </shape>
    </item>
</layer-list>

Selon vos besoins, au lieu d'utiliser une liste de couches, vous pouvez utiliser l'un des types de dessin suivants:

  • liste de couches
  • sélecteur
  • liste de niveaux
  • transition

Pour plus d'informations sur les types de dessin disponibles, voir this Android documentation

Sources:

58
TheIT

La réponse de Lyobomyr fonctionne, mais voici la même solution appliquée mais sans la surcharge de création d'un nouveau dessinable, minimisant ainsi l'encombrement des fichiers:

https://stackoverflow.com/a/3588976/578746

Copier/coller de la réponse par anon sur la réponse SO ci-dessus:

<item Android:left="6dp"
      Android:right="6dp">

    <shape Android:shape="rectangle">
        <gradient Android:startColor="#ccd0d3"
                  Android:centerColor="#b6babd"
                  Android:endColor="#ccd0d3"
                  Android:height="1px"
                  Android:angle="0"/>
    </shape>
</item>
17
Yahel

Vous pouvez essayer des encarts:

<?xml version="1.0" encoding="UTF-8"?>
<inset xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:insetBottom="2dp"
    Android:insetLeft="1dp"
    Android:insetRight="20dp"
    Android:insetTop="20dp">

    <shape Android:shape="rectangle">

        <stroke
            Android:width="1dp"
            Android:color="#ffffff"
            Android:dashWidth="2dp" />

        <solid Android:color="@color/button_white_cover" />

        <corners Android:radius="11dp" />
    </shape>

</inset>
10
Witoldio

J'ai résolu ce problème comme ceci:

<shape Android:shape="oval"  >
    <stroke Android:width="4dp" Android:color="@Android:color/transparent" />
    <solid Android:color="@color/colorAccent" />
</shape>

vient d'y ajouter un trait transparent.

6
riverlet