Eu preciso implementar meus próprios atributos como em com.android.R.attr
Não encontrei nada na documentação oficial, por isso preciso de informações sobre como definir esses atributos e como usá-los no meu código.
android
android-resources
android-attributes
Alexander Oleynikov
fonte
fonte
Respostas:
Atualmente, a melhor documentação é a fonte. Você pode dar uma olhada aqui (attrs.xml) .
Você pode definir atributos no
<resources>
elemento superior ou dentro de um<declare-styleable>
elemento. Se eu vou usar um attr em mais de um lugar, eu o coloco no elemento raiz. Observe que todos os atributos compartilham o mesmo espaço para nome global. Isso significa que, mesmo que você crie um novo atributo dentro de um<declare-styleable>
elemento, ele poderá ser usado fora dele e você não poderá criar outro atributo com o mesmo nome de um tipo diferente.Um
<attr>
elemento possui dois atributos xmlname
eformat
.name
permite chamá-lo de algo e é assim que você acaba se referindo a ele no código, por exemploR.attr.my_attribute
,. Oformat
atributo pode ter valores diferentes, dependendo do 'tipo' de atributo que você deseja.Você pode definir o formato para vários tipos usando
|
, por exemploformat="reference|color"
,.enum
atributos podem ser definidos da seguinte maneira:flag
Os atributos são semelhantes, exceto que os valores precisam ser definidos para que possam ser agrupados:Além dos atributos, existe o
<declare-styleable>
elemento Isso permite definir atributos que uma exibição personalizada pode usar. Você faz isso especificando um<attr>
elemento; se ele foi definido anteriormente, você não especifica oformat
. Se você deseja reutilizar um atributo android, por exemplo, android: gravity, faça isso daname
seguinte maneira.Um exemplo de uma visualização personalizada
<declare-styleable>
:Ao definir seus atributos customizados em XML em sua visualização customizada, você precisa fazer algumas coisas. Primeiro você deve declarar um espaço para nome para encontrar seus atributos. Você faz isso no elemento de layout raiz. Normalmente existe apenas
xmlns:android="http://schemas.android.com/apk/res/android"
. Agora você também deve adicionarxmlns:whatever="http://schemas.android.com/apk/res-auto"
.Exemplo:
Por fim, para acessar esse atributo customizado, você normalmente o faz no construtor de sua visualização customizada, como a seguir.
O fim. :)
fonte
View
: github.com/commonsguy/cw-advandroid/tree/master/Views/…xmlns:my="http://schemas.android.com/apk/lib/my.namespace"
- sem copiar attrs.xml. Observe que o caminho do URI do namespace deve ser / apk / * lib * not / apk / res.apk/lib
truque não funcionou para mim em atributos personalizados com formato de referência de um projeto de biblioteca. O que fez trabalho foi o usoapk/res-auto
, como sugerido na stackoverflow.com/a/13420366/22904 logo abaixo e também no stackoverflow.com/a/10217752enum
eflag
: o primeiro nos permite escolher um e apenas um valor, o último nos permite combinar vários. Escrevi uma resposta mais longa em uma pergunta semelhante aqui e, tendo encontrado essa pergunta, achei que iria vincular a ela.a.recycle()
é muito importante aqui para liberar memóriaA resposta do Qberticus é boa, mas falta um detalhe útil. Se você os estiver implementando em uma biblioteca, substitua:
com:
Caso contrário, o aplicativo que usa a biblioteca terá erros de tempo de execução.
fonte
A resposta acima cobre tudo em grande detalhe, além de algumas coisas.
Primeiro, se não houver estilos, a
(Context context, AttributeSet attrs)
assinatura do método será usada para instanciar a preferência. Nesse caso, use apenascontext.obtainStyledAttributes(attrs, R.styleable.MyCustomView)
para obter o TypedArray.Em segundo lugar, não aborda como lidar com os recursos das plurais (sequências de quantidade). Isso não pode ser tratado com o TypedArray. Aqui está um trecho de código do meu SeekBarPreference que define o resumo da preferência, formatando seu valor de acordo com o valor da preferência. Se o xml da preferência definir android: summary como uma sequência de texto ou uma sequência de caracteres, o valor da preferência será formatado na sequência de caracteres (ele deve ter% d, para selecionar o valor). Se android: summary estiver definido como um recurso de plaurals, isso será usado para formatar o resultado.
notifyChanged()
oonDialogClosed
método da preferência .fonte
A abordagem tradicional é cheia de código padrão e manipulação de recursos desajeitada. Foi por isso que criei a estrutura Spyglass . Para demonstrar como funciona, aqui está um exemplo que mostra como criar uma exibição personalizada que exibe um título de String.
Etapa 1: Crie uma classe de exibição personalizada.
Etapa 2: defina um atributo de sequência no
values/attrs.xml
arquivo de recurso:Etapa 3: aplique a
@StringHandler
anotação aosetTitle
método para informar à estrutura do Spyglass para rotear o valor do atributo para esse método quando a exibição for inflada.Agora que sua classe possui uma anotação Spyglass, a estrutura Spyglass a detectará em tempo de compilação e gerará automaticamente a
CustomView_SpyglassCompanion
classe.Etapa 4: use a classe gerada no
init
método da visualização personalizada :É isso aí. Agora, quando você instancia a classe a partir do XML, o companheiro Spyglass interpreta os atributos e faz a chamada de método necessária. Por exemplo, se inflarmos o seguinte layout,
setTitle
ele será chamado com"Hello, World!"
o argumentoA estrutura não se limita aos recursos de cadeia de caracteres e possui muitas anotações diferentes para manipular outros tipos de recursos. Ele também possui anotações para definir valores padrão e para passar valores de espaço reservado, se seus métodos tiverem vários parâmetros.
Dê uma olhada no repositório do Github para obter mais informações e exemplos.
fonte
android:title="@{"Hello, world!"}"
.se você omitir o
format
atributo doattr
elemento, poderá usá-lo para referenciar uma classe a partir de layouts XML.Refactor > Rename
trabalhoFind Usages
trabalhonão especifique um
format
atributo em ... / src / main / res / values / attrs.xmluse-o em algum arquivo de layout ... / src / main / res / layout / activity__main_menu.xml
analise a classe no seu código de inicialização de exibição ... / src / main / java /.../ MyCustomView.kt
fonte