Le remplissage n'affecte pas <shape> dans une mise en page XML

92

J'essaie de définir un rembourrage dans une <shape>déclaration dans un fichier / une mise en page XML. Mais quoi que je définisse, rien ne change en ce qui concerne 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 s'il vous plaît 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>
Lyubomyr Dutko
la source

Réponses:

113

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 remplissage dans un autre dessinable qui l'utilisera. Donc, j'ai un dessinable qui utilise la forme et là je fais ce qui suit:

<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 le deuxième <item>élément, j'ai défini le remplissage (en haut et à droite). Et après cela, tout fonctionne.

Merci.

Lyubomyr Dutko
la source
Salut, je ne comprends pas comment appliquer cette solution au problème. J'ai un bouton qui utilise la forme et le réglage adnroid: top et android: right n'a aucun effet. Comment résoudre ce problème? Merci.
Icecream
2
JE PENSE que ce que Lyubomyr dit est de faire quelque chose comme ça, qui fonctionne pour moi, mais les coins ont toujours un fond blanc opaque, ce qui cause des problèmes d'affichage (désolé pour le format dans les commentaires!): <Layer-list xmlns: android = " schemas.android.com/apk/res/android "> <item> <shape android: shape =" rectangle "> <size android: width =" 0dp "android: height =" 45dp "android: color =" @ android: color / transparent "/> </shape> </item> <item android: top =" 0dp "android: right =" 0dp "android: bottom =" 0dp "android: left =" 0dp "android: drawable =" @ drawable / button_blue_shape "/> </layer-list>
DustinB
Également hors sujet mais peut être utile: si votre dessin utilisé n'est qu'une couleur, vous pouvez également écrire comme android: drawable = "@ color / divider". MAIS cela casse sur les appareils plus anciens. Je l'ai testé sur 2.2 et il était cassé. Je ne sais pas à quel niveau il est devenu acceptable.
Pijusn
En fait, <item>accepte les enfants dessinables (bien que cela ne soit pas explicitement documenté). C'est ainsi que vous pouvez obtenir ce comportement dans un seul XML.
Alex Cohn
3
Cette réponse semble correcte même sept ans plus tard. A quoi diable sert <shape><padding> -il ?
David Lord
75

Comme quelques commentaires l'ont fait allusion, la meilleure approche consiste à envelopper l' élément <shape>dans un <item>élément et à y définir 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, consultez cette documentation Android

Sources:

TheIT
la source
oui, vous n'avez pas mentionné<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 Je ne suis pas sûr de votre argument. On peut inclure l'élément dans une <layer-list> si cela sert ses objectifs, mais ce n'est pas nécessaire pour la question d'origine ni pour transmettre la solution générale qui consiste à imbriquer le contenu dans un <item> avec rembourrage
TheIT
3
Je veux dire qu'il est préférable de donner un exemple que vous pouvez copier et exécuter sans éditions, mais dans ce cas, <item> ne serait pas résolu (car il devrait être à l'intérieur de <layer-list>)
user924
2
@ user924 Je vois ce que vous voulez dire maintenant, merci beaucoup d'avoir signalé le problème et aidé à améliorer la réponse. J'ai mis à jour l'exemple de code et ajouté un commentaire sur les types de dessin disponibles
TheIT
22

Vous pouvez essayer les inserts:

<?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>
Witoldio
la source
22

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

Copiez / collez 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>

Yahel
la source
1
Merci pour cette réponse Yahel, mais n'oubliez pas de ne pas poster de lien uniquement des réponses. Fournissez toujours toutes les informations nécessaires dans votre réponse car le contenu du lien peut changer ou devenir invalide.
TheIT
Modification de la réponse
Yahel
9

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.

rivière
la source
Intelligent, mais je considérerais cela comme un hack: - /
dell116