Em um arquivo XML, podemos atribuir um ID a uma exibição como android:id="@+id/something"
e depois chamar findViewById()
, mas, ao criar uma exibição programaticamente, como atribuo uma ID?
Eu acho que setId()
não é o mesmo que atribuição padrão. setId()
é extra.
Alguém pode me corrigir?
Respostas:
id
Visão geral do AndroidUm Android
id
é um número inteiro comumente usado para identificar visualizações; issoid
pode ser atribuído via XML (quando possível) e via código (programaticamente).id
É o mais útil para obter referências paraView
s definidos em XML gerados por umInflater
(como usandosetContentView
.)Atribuir
id
viaXML
android:id="@+id/
somename"
à sua exibição.android:id
ele recebe um exclusivoint
para uso em código.android:id
'sint
valor no código usando 'R.id.
somename'(efetivamente uma constante.)int
pode mudar de compilação para compilação, portanto, nunca copie um ID degen/
package.name/R.java
, apenas use "R.id.
somename".id
atribuído a umPreference
XML não é usado quando oPreference
geraView
.)Atribuir
id
via código (programaticamente)id
s usandosomeView.setId(
int);
int
deve ser positivo, mas é outra forma arbitrary- ele pode ser o que quiser (continue lendo se isso é terrível.)Exclusividade de
id
sXML
id
s atribuídos serão únicos.id
s que não tem que ser únicoid
S atribuídos a código podem (teoricamente) entrar em conflito com sXML
atribuídosid
.id
s conflitantes não importam se consultados corretamente (continue lendo) .Quando (e por que) conflitos
id
não importamfindViewById(int)
iterará a profundidade primeiro recursivamente através da hierarquia da visualização da Visualização especificada e retornará a primeiraView
encontrada com uma correspondênciaid
.id
s atribuídos por código antes de um XML definidoid
na hierarquia,findViewById(R.id.somename)
sempre retornará a Visualização definida em XML, entãoid
'd.Criando vistas dinamicamente e atribuindo
ID
sViewGroup
comid
.LinearLayout
comandroid:id="@+id/placeholder"
.ViewGroup
comView
s.id
s que sejam convenientes para cada visualização.Consulte essas exibições filho usando placeholder.findViewById (convenientInt);
Introduzida a API 17,
View.generateViewId()
que permite gerar um ID exclusivo.Se você optar por manter as referências às visualizações , instancie-as
getApplicationContext()
e defina cada referência como nulaonDestroy
. Aparentemente, vazar oActivity
(pendurado nele depois de destruído) é um desperdício .. :)Reserve um XML
android:id
para uso no códigoAPI 17 introduzida
View.generateViewId()
que gera um ID exclusivo. (Agradecemos a oportunidade de fazer alterações por apontar isso.) *Se você
ViewGroup
não pode ser definido via XML (ou não deseja), você pode reservar o ID via XML para garantir que ele permaneça único:Aqui, values / ids.xml define um costume
id
:Depois que o ViewGroup ou View for criado, você poderá anexar o ID personalizado
id
Exemplo conflitantePara maior clareza, por exemplo ofuscante, vamos examinar o que acontece quando há um
id
conflito nos bastidores.layout / mylayout.xml
Para simular um conflito, digamos que nossa última compilação tenha atribuído
R.id.placeholder
(@+id/placeholder
) umint
valor de12
..Em seguida, MyActivity.java define algumas visualizações adicionadas programaticamente (via código):
Então,
placeholder
e um dos nossos novosTextView
s tem umid
de 12! Mas isso não é realmente um problema se consultarmos as visualizações de filhos do espaço reservado:*Não é tão ruim
fonte
findViewById
a exploração é aprofundada, portanto, "Enquanto não houver IDs atribuídos por código atribuídos acima de um ID definido em XML na hierarquia" não é tecnicamente correto; é "antes" e não "acima".ids.xml
. Para IDs verdadeiramente arbitrários, useView.generateViewId()
(API 17). (Por favor, esclareça o seu ponto, se eu perdi isso.)PreferenceDialogFragmentCompat
parece que os IDs deR.id
não correspondem à hierarquia de exibição. Dessa forma, não consigo encontrar a visualização por ID.Você pode apenas usar o
View.setId(integer)
para isso. No XML, mesmo que você esteja definindo um ID de String, isso é convertido em um número inteiro. Devido a isso, você pode usar qualquer número inteiro (positivo) paraViews
adicionar programaticamente.Créditos a esta resposta .
fonte
Sim, você pode chamar
setId(value)
qualquer visualização com qualquer valor inteiro (positivo) que desejar e encontrá-lo no contêiner pai usandofindViewById(value)
. Observe que é válido chamarsetId()
com o mesmo valor para diferentes visualizações de irmãos, masfindViewById()
retornará apenas a primeira.fonte
findViewById
um ancestral conhecido é uma boa ideia por razões de desempenho, mas não garante que ele encontre um filho imediato se houver um com o ID correto.