O preenchimento não afeta a <shape> em um layout XML

96

Estou tentando definir o preenchimento em um <shape>declarado em um arquivo / layout XML. Mas o que quer que eu defina, nada muda relacionado ao preenchimento. Se eu modificar qualquer outra propriedade, vejo os efeitos na IU. Mas não funciona com preenchimento. Você poderia informar sobre os possíveis motivos pelos quais isso pode ocorrer?

Aqui está o formato XML que estou tentando estilizar:

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

Respostas:

115

Finalmente resolvi meu problema com preenchimento.

Portanto, o preenchimento aqui não terá efeito na forma. Em vez disso, você terá que aplicar preenchimento em outro drawable que irá utilizá-lo. Portanto, tenho um drawable que usa a forma e faço o seguinte:

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

Então, como você pode ver no segundo <item>elemento, eu defini o preenchimento (superior e direito). E depois disso tudo funciona.

Obrigado.

Lyubomyr Dutko
fonte
Olá, não entendo como aplicar esta solução ao problema. Eu tenho um botão que usa a forma e configuração adnroid: top e android: right não tem efeito. Como eu resolveria isso? Obrigado.
sorvete de
2
ACHO que o que Lyubomyr está dizendo é fazer algo assim, que funciona para mim, mas os cantos sempre têm um fundo branco opaco, causando problemas de exibição (desculpe pelo formato nos comentários!): <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
Também fora do tópico, mas pode ser útil: se o drawable usado for apenas uma cor, você também pode escrever como android: drawable = "@ color / divider". MAS isso quebra em dispositivos mais antigos. Eu testei no 2.2 e estava quebrado. Não tenho certeza em que nível se tornou aceitável.
Pijusn
Na verdade, <item>aceita drawables filho (embora não seja explicitamente documentado). É assim que você pode obter esse comportamento em um único xml.
Alex Cohn
3
Essa resposta parece estar correta mesmo sete anos depois. O que na terra é <shape><padding> para ?
David Lord
75

Como alguns comentários já mencionaram, a melhor abordagem é envolver o <shape>em um <item>elemento e definir o preenchimento lá. No entanto, existem outras opções disponíveis que são detalhadas no link abaixo. por exemplo

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

Dependendo de suas necessidades, em vez de usar uma lista de camadas, você pode usar qualquer um dos seguintes tipos de drawable:

  • lista de camadas
  • seletor
  • lista de níveis
  • transição

Para obter mais informações sobre os tipos de drawable disponíveis, consulte esta documentação do Android

Fontes:

A coisa
fonte
sim, você não mencionou<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
user924
@ user924 Não tenho certeza de qual é o seu ponto. Pode-se incluir o item dentro de uma <layer-list> se isso servir aos propósitos, mas não é necessário para a questão original nem para transmitir a solução geral que é aninhar o conteúdo dentro de um <item> com preenchimento
TheIT
3
Quero dizer, é melhor dar um exemplo que você pode copiar e executar sem edições, mas neste caso <item> não seria resolvido (porque deveria estar dentro de <layer-list>)
user924 01 de
2
@ user924 Entendo o que você quer dizer agora. Muito obrigado por apontar o problema e ajudar a melhorar a resposta. Atualizei a amostra de código e adicionei um comentário sobre os tipos de drawable disponíveis
TheIT
24

A resposta de Lyobomyr funciona, mas aqui está a mesma solução aplicada, mas sem a sobrecarga de criar um novo drawable, minimizando assim a confusão de arquivos:

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

Copie / cole a resposta por anon na resposta SO acima:

<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
fonte
1
Obrigado por esta resposta Yahel, mas lembre-se de não postar respostas apenas com links. Sempre forneça todas as informações necessárias em sua resposta, pois o conteúdo do link pode mudar ou se tornar inválido.
TheIT
Resposta editada
Yahel
23

Você pode tentar inserções:

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

Resolvi este problema assim:

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

acabou de adicionar um traço transparente a ele.

riozinho
fonte
Inteligente, mas eu consideraria isso um hack: - /
dell116