Criei um widget personalizado e estou declarando-o em layout.xml. Também adicionei alguns atributos personalizados no attr.xml. No entanto, ao tentar declarar esses atributos em um estilo em styles.xml, está me fornecendoNo resource found that matches the given name: attr 'custom:attribute'.
Eu coloquei o xmlns:custom="http://schemas.android.com/apk/res/com.my.package"
em todas as tags em styles.xml, incluindo <?xml>
, <resources>
e <style>
, mas ainda me dá o mesmo erro, que não conseguem encontrar o meu espaço de nomes XML personalizado.
No entanto, posso usar meu espaço para nome para atribuir atributos manualmente à exibição em meu layout.xml, para que não haja nada errado com o espaço para nome. Meu problema está em tornar o styles.xml ciente do meu attr.xml.
fonte
cutsom:xmlns=...
?? não deveria serxmlns:cutsom=...
?Respostas:
Eu descobri isso! A resposta é NÃO especificar o espaço para nome no estilo.
fonte
declare-stylable
enum, em vez de. Não sei por que as enums não estavam funcionando, mas essa solução foi boa o suficiente para mim.Como a resposta acima foi trabalhada para mim, tentei uma mudança no comitê, declaro ser estilosa para uma classe no elemento de recursos.
em declare-styleable , o atributo name referenciou um nome de classe, portanto, eu tive uma chamada de classe de exibição "com.my.package.name.VerticalView", pois representava que essa declaração deveria ser usada no VerticalView ou nas subclasses de VerticalView. para que possamos declarar estilo assim:
por isso não declaramos namespace no elemento resources, ele ainda funciona.
fonte
values / styles.xml
values / attrs.xml
values / colors.xml
values / dimens.xml
Usando
DEMO
fonte
A modificação de Styler e vince funcionou para mim. Queria ressaltar que a explicação de @ vince pode não ser totalmente exata.
Para testar a hipótese de que o atributo name da
declare-styleable
correspondência com o nome da classe de visualização customizada está nos permitindo acessar o atributo customizado sem um espaço para nome, alterei o nome dodeclare-styleable
(a visualização customizada foi nomeadaTestViewFont
:Alterei a
obtainStyledAttributes
chamada na exibição personalizada para refletir isso:O código ainda foi executado. Portanto, não acho que seja algum tipo de introspecção por parte
declare-styleable
da classe que recebeu o nome.Portanto, sou levado a acreditar que qualquer atributo personalizado pode ser usado para declarar um estilo sem se referir a um espaço para nome.
Independentemente disso, obrigado por toda a ajuda, resolveu o meu problema.
fonte
declare-styleable
bloco ou não. (desculpe, não consigo encontrar a página de referência para isso ...) Exceto pelos atributos doandroid
espaço para nome, você deve indicar apenas o nome do atributo.Definir alguns atributos
Use-o no arquivo de layout como
Finalmente use-o no arquivo de estilo
A diferença entre o arquivo de estilo e o arquivo de layout é que não adicionamos prefiexapp:
Experimente, tenha um bom dia, isso funciona para mim.
fonte
Caso isso ajude mais alguém, meu erro foi que minha classe de exibição personalizada estava chamando AttributeSet.getAttributeValue, por exemplo
... o que resultou em meu atributo personalizado não ser lido na minha visualização personalizada.
A correção era para usar
obtainStyledAttributes
na minha exibição personalizada:Uma dica de que isso está funcionando corretamente é que você pode pressionar Ctrl / Apple +
R.styleable.MyTextViewStyleable_customFont
e ser direcionado diretamente à sua definição attrs.xml.Demorei um pouco para identificar essa diferença crítica entre meu código e os outros exemplos, pois o atributo customizado funcionava bem quando transmitido diretamente pelo XML do layout (e não por um estilo).
fonte