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>

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.


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:


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>

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>


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.


Inteligente, pero lo consideraría un truco: - /
dell116
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.