El relleno no afecta en un diseño XML

5 minutos de lectura

avatar de usuario
Lyubomyr Dutko

Estoy tratando de establecer el relleno en un <shape> declarado dentro de un archivo/diseño XML. Pero lo que sea que establezca, nada cambia en relación con el relleno. Si modifico cualquier otra propiedad, veo los efectos en la interfaz de usuario. Pero no funciona con relleno. ¿Podría aconsejarme 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>

Finalmente he resuelto mi problema con el relleno.

Entonces, el relleno aquí no tendrá efecto en la forma. En lugar de esto, deberá aplicar relleno en otro elemento de diseño que lo usará. Entonces, tengo un dibujable que usa la forma y allí 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 puedes ver en el segundo <item>-elemento configuro padding (superior y derecho). 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 resolvería esto? Gracias.

    – helado

    18 de octubre de 2010 a las 7:08

  • PIENSO que lo que dice Lyubomyr es hacer algo como esto, que funciona para mí, pero las esquinas siempre tienen un fondo blanco opaco, lo que causa problemas de visualización (¡perdón por el formato en los comentarios!): esquemas.android.com/apk/res/android“>

    – DustinB

    18 de febrero de 2011 a las 22:12


  • También fuera de tema, pero podría ser útil: si su dibujable 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

    8 de enero de 2013 a las 8:48

  • Realmente, <item> acepta dibujables secundarios (aunque no está documentado explícitamente). Así es como puede lograr este comportamiento dentro de un solo xml.

    – Alex Cohn

    11 mayo 2015 a las 19:30

  • Esta respuesta parece ser correcta incluso siete años después. ¿Qué diablos es <shape><padding> por?

    – David Señor

    25 de diciembre de 2016 a las 10:52

avatar de usuario
La cosa

Como han aludido un par de comentarios, el mejor enfoque es envolver el <shape> en un <item> elemento y establezca el relleno allí en su lugar. Sin embargo, hay otras opciones disponibles que se detallan en el siguiente enlace. 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 de elementos de diseño:

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

  • comentario de DustinB
  • la respuesta de yahel
  • comentario de usuario924
  • ¿Cómo agregar relleno al degradado en Android?

  • si, no mencionaste <layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    – usuario924

    31 de agosto de 2017 a las 13:25

  • @ user924 No estoy seguro de cuál es tu punto. Se puede incluir el elemento dentro de una si eso sirve para sus propósitos, pero no es necesario para la pregunta original ni para transmitir la solución general que es anidar el contenido dentro de un con relleno

    – La cosa

    31 de agosto de 2017 a las 23:15

  • Quiero decir que es mejor dar un ejemplo que pueda copiar y ejecutar sin ediciones, pero en este caso no se resolvería (porque debería estar dentro de )

    – usuario924

    1 de septiembre de 2017 a las 7:59

  • @ user924 Ahora veo lo que quiere decir, muchas gracias por señalar el problema y ayudar a mejorar la respuesta. Actualicé el ejemplo de código y agregué un comentario sobre los tipos de elementos de diseño disponibles.

    – La cosa

    3 sep 2017 a las 22:42


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>

avatar de usuario
Yahel

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, por lo tanto, minimizando el desorden de archivos:

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

Copie / pegue la respuesta de anon en la respuesta SO anterior:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <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>
</layer-list> 

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

    22 de febrero de 2019 a las 21:56

  • Inteligente, pero lo consideraría un truco :-/

    – dell116

    22 de febrero de 2019 a las 21:56

¿Ha sido útil esta solución?