Estou escrevendo algumas visualizações personalizadas que compartilham alguns atributos com o mesmo nome. Em sua respectiva <declare-styleable>
seção, attrs.xml
eu gostaria de usar os mesmos nomes para atributos:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyView1">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
<declare-styleable name="MyView2">
<attr name="myattr1" format="string" />
<attr name="myattr2" format="dimension" />
...
</declare-styleable>
</resources>
Estou recebendo um erro dizendo isso myattr1
e myattr2
já está definido. Descobri que deveria omitir o format
atributo for myattr1
e myattr2
in MyView2
, mas se fizer isso, obtenho o seguinte erro no console:
[2010-12-13 23:53:11 - MyProject] ERROR: In <declare-styleable> MyView2, unable to find attribute
Existe uma maneira de eu conseguir isso, talvez algum tipo de espaço para nome (apenas adivinhando)?
myattr1
está a stringMyView1
e o número inteiroMyView2
?ERROR: In <declare-styleable> com_app_view_widget, unable to find attribute customAttr
Por todas as visualizações que tento declarar. Alguma ideia?<attr name="myattr1" format="string|integer" />
. Funciona para mim.Estou postando esta resposta, pois a solução postada acima não funcionou para mim no Android Studio. Preciso compartilhar meus atributos personalizados entre minhas visualizações personalizadas. Tentei a solução acima no Android Studio, mas não tive sorte. Então, experimento e faço uma maneira de fazê-lo. Espero que ajude alguém que esteja procurando pelo mesmo problema.
Isso funciona para mim completamente. Precisamos tornar um pai estiloso e, em seguida, herdar esse pai estilizado. Por exemplo, como eu fiz acima: Nome estiloso pai MyView e herdou isso para outros estilos como MyView1 e MyView2, respectivamente.
fonte
MyView2
direita:R.styleable.MyView2_myattr1
, errado:R.styleable.MyView_myattr1
)Como Priya Singhal respondeu, o Android Studio exige que os nomes de atributos comuns sejam definidos em seu próprio nome de estilo. Eles não podem mais estar na raiz.
No entanto, há algumas outras coisas a serem observadas (e é por isso que também estou adicionando uma resposta):
Exemplo
Aqui está o que eu fiz em um projeto recente que possui duas visualizações personalizadas que compartilham os mesmos atributos. Enquanto as visualizações personalizadas ainda tiverem os nomes dos atributos e não incluírem a
format
, ainda posso acessá-las normalmente a partir do código.Exemplo simplificado
Na verdade, nem preciso colocar os atributos em um nome personalizado. Desde que eu os defina (dê a
format
) a pelo menos uma visualização personalizada, posso usá-los em qualquer lugar (sem aformat
). Portanto, isso também funciona (e parece mais limpo):Para um projeto grande, porém, isso pode ficar confuso e defini-los na parte superior em um único local pode ser melhor (como recomendado aqui ).
fonte
parent
atributo, mas não vi muitas postagens sugerindo seu uso.parent
. Eu acho que estava apenas dizendo que não era necessário.Graças a Lewis, tive o mesmo problema, e sua solução de herança me deu a dica para fazê-lo como abaixo e funciona bem. Acabei de declarar atributos comuns no item acima e reescrevê-lo no corpo da declaração de estilo novamente sem formatação. Eu espero que isso ajude alguém
fonte
Apenas no caso de alguém ainda estar com esse problema depois de tentar a solução disponível. Fiquei com adicionar
subtitle
atributo comstring
formato.Minha solução é remover o formato.
antes:
<attr name="subtitle" format="string"/>
depois de:
<attr name="subtitle"/>
fonte