El relleno no afecta a <shape> en un diseño XML

92

Estoy tratando de configurar el relleno en un <shape>archivo / diseño XML declarado. Pero sea lo que sea que establezca, nada cambia relacionado con el relleno. Si modifico otras propiedades, veo los efectos en la interfaz de usuario. Pero no funciona con acolchado. ¿Podría informarnos sobre las posibles razones por las que esto podría ocurrir?

Aquí está la forma XML que estoy tratando de diseñar:

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

Respuestas:

113

Finalmente resolví mi problema con el relleno.

Así que el relleno aquí no tendrá ningún efecto sobre la forma. En lugar de esto, tendrás que aplicar relleno en otro dibujable que lo usará. Entonces, tengo un dibujable que usa la forma y ahí hago lo siguiente:

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

Entonces, como puede ver en el segundo <item>elemento, configuré el relleno (superior y derecha). Y después de esto todo funciona.

Gracias.

Lyubomyr Dutko
fuente
Hola, no entiendo cómo aplicar esta solución al problema. Tengo un botón que usa la forma y la configuración adnroid: top y android: right no tiene ningún efecto. ¿Cómo solucionaría esto? Gracias.
helado
2
CREO que lo que Lyubomyr está diciendo es hacer algo como esto, que funciona para mí, pero luego las esquinas siempre tienen un fondo blanco opaco, causando problemas de visualización (¡perdón por el formato en los comentarios!): <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
También fuera de tema, pero podría ser útil: si el elemento de dibujo utilizado es solo un color, también puede escribir como android: drawable = "@ color / divider". PERO esto se rompe en dispositivos más antiguos. Lo probé en 2.2 y estaba roto. No estoy seguro de a qué nivel se volvió aceptable.
Pijusn
De hecho, <item>acepta elementos infantiles para dibujar (aunque no está documentado explícitamente). Así es como puede lograr este comportamiento dentro de un solo xml.
Alex Cohn
3
Esta respuesta parece ser correcta incluso siete años después. Lo que en la tierra es <shape><padding> para ?
David Lord
75

Como se ha aludido en un par de comentarios, el mejor enfoque es envolver el elemento <shape>en un <item>elemento y colocar el relleno allí. Sin embargo, hay otras opciones disponibles que se detallan en el enlace a continuación. p.ej

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

Dependiendo de sus necesidades, en lugar de usar una lista de capas, puede usar cualquiera de los siguientes tipos dibujables:

  • lista de capas
  • selector
  • lista de niveles
  • transición

Para obtener más información sobre los tipos de elementos de diseño disponibles, consulte esta documentación de Android

Fuentes:

La cosa
fuente
sí, no lo mencionaste<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 No estoy seguro de cuál es tu punto. Se puede incluir el elemento dentro de una <layer-list> si eso sirve a los propósitos de uno, pero no es necesario para la pregunta original ni para transmitir la solución general que es anidar el contenido dentro de un <item> con relleno
TheIT
3
Quiero decir que es mejor dar un ejemplo que pueda copiar y ejecutar sin ediciones, pero en este caso <item> no se resolvería (porque debería estar dentro de <layer-list>)
user924
2
@ user924 Entiendo a qué te refieres ahora, muchas gracias por señalar el problema y ayudar a mejorar la respuesta.
Actualicé
22

Puedes probar las inserciones:

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

La respuesta de Lyobomyr funciona, pero aquí se aplica la misma solución pero sin la sobrecarga de crear un nuevo elemento de diseño, lo que minimiza el desorden de archivos:

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

Copie / pegue la respuesta de forma anónima en la respuesta SO anterior:

<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
fuente
1
Gracias por esta respuesta Yahel, pero recuerda no publicar enlaces solo respuestas. Siempre proporcione toda la información necesaria en su respuesta, ya que el contenido del enlace puede cambiar o dejar de ser válido.
TheIT
Editó la respuesta
Yahel
9

Resolví este problema así:

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

acaba de agregarle un trazo transparente.

riachuelo
fuente
Inteligente, pero lo consideraría un truco: - /
dell116