2009-08-15 4 views
43

J'essaie de définir un remplissage dans un <shape> déclaré dans un fichier/une mise en page XML. Mais peu importe ce que je définis, 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 donner des conseils sur les raisons possibles pour lesquelles cela pourrait se produire?Le remplissage n'affecte pas <shape> dans une mise en page XML

est ici la forme XML que je suis en train de style:

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

Répondre

81

J'ai finalement résolu mon problème avec un rembourrage.

Donc, le rembourrage ici n'aura aucun effet sur la forme. Au lieu de cela, vous devrez appliquer un padding dans un autre drawable qui l'utilisera. Donc, j'ai un drawable qui utilise la forme et là je 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 la deuxième <item> -Element je mis padding (en haut et à droite). Et après cela, tout fonctionne.

Merci.

+0

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: haut et android: droite n'a aucun effet. Comment pourrais-je résoudre ceci? Merci. – icecream

+2

Je pense que ce que dit Lyubomyr est de faire quelque chose comme ça, mais les coins ont toujours un fond blanc opaque, provoquant des problèmes d'affichage (désolé pour le format dans les commentaires!): \t \t \t \t \t \t \t \t \t \t DustinB

+0

Aussi hors sujet mais peut-être utile: si votre dessin utilisable est juste une couleur, vous pouvez aussi é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 cela est devenu acceptable. – Pijusn

13

La réponse par Lyobomyr fonctionne, mais voici la même solution appliquée mais sans les frais généraux de la création d'une nouvelle drawable, minimisant ainsi l'encombrement du fichier:

How to add padding to gradient <shape> in Android?

+0

Merci pour cette réponse Yahel, mais rappelez-vous de ne pas poster des réponses seulement au lien. Toujours fournir toutes les informations nécessaires dans votre réponse que le contenu du lien peut changer ou devenir invalide. – TheIT

31

En quelques commentaires ont fait allusion à , la meilleure approche consiste à envelopper le <shape> dans un élément <item> et de définir le remplissage à la place. Il existe cependant d'autres options 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> 

En fonction de vos besoins, au lieu d'utiliser une couche liste, vous pouvez utiliser l'un des types étirables suivants:

  • couche liste
  • sélecteur
  • niveau liste
  • transition

Pour plus d'informations ab les types étirables disponibles voir this android documentation

Sources:

+0

ouais, vous n'avez pas mentionné '' – user924

+0

@ user924 Je ne suis pas sûr de ce que votre point est. On peut inclure l'article à l'intérieur d'un si cela sert à ses fins, mais ce n'est pas nécessaire pour la question originale ni pour transmettre la solution générale qui consiste à imbriquer le contenu à l'intérieur d'un avec remplissage – TheIT

+1

Je veux dire qu'il est préférable de donner un exemple peut copier et exécuter sans éditions, mais dans ce cas ne serait pas résolu (car il devrait être à l'intérieur ) – user924

3

Je résolu ce problème comme celui-ci:

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

0

Vous pouvez essayer: empiècements

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