id
Visão geral do Android
Um Android id
é um número inteiro comumente usado para identificar visualizações; isso id
pode ser atribuído via XML (quando possível) e via código (programaticamente). id
É o mais útil para obter referências para View
s definidos em XML gerados por um Inflater
(como usando setContentView
.)
Atribuir id
viaXML
- Adicione um atributo de
android:id="@+id/
somename "
à sua exibição.
- Quando seu aplicativo é criado,
android:id
ele recebe um exclusivo int
para uso em código.
- Referência seu
android:id
's int
valor no código usando ' R.id.
somename'(efetivamente uma constante.)
- isso
int
pode mudar de compilação para compilação, portanto, nunca copie um ID de gen/
package.name/ R.java
, apenas use " R.id.
somename".
- (Além disso, um
id
atribuído a um Preference
XML não é usado quando o Preference
gera View
.)
Atribuir id
via código (programaticamente)
- Defina manualmente
id
s usando someView.setId(
int);
- O
int
deve ser positivo, mas é outra forma arbitrary- ele pode ser o que quiser (continue lendo se isso é terrível.)
- Por exemplo, se você criar e numerar várias visualizações que representam itens, poderá usar o número do item.
Exclusividade de id
s
XML
id
s atribuídos serão únicos.
- Atribuído pelo Código
id
s que não tem que ser único
id
S atribuídos a código podem (teoricamente) entrar em conflito com s XML
atribuídos id
.
- Esses
id
s conflitantes não importam se consultados corretamente (continue lendo) .
Quando (e por que) conflitos id
não importam
findViewById(int)
iterará a profundidade primeiro recursivamente através da hierarquia da visualização da Visualização especificada e retornará a primeira View
encontrada com uma correspondência id
.
- Desde que não haja
id
s atribuídos por código antes de um XML definido id
na hierarquia, findViewById(R.id.somename)
sempre retornará a Visualização definida em XML, então id
'd.
Criando vistas dinamicamente e atribuindo ID
s
- No XML do layout, defina um vazio
ViewGroup
com id
.
- Tal como um
LinearLayout
com android:id="@+id/placeholder"
.
- Use o código para preencher o espaço reservado
ViewGroup
com View
s.
- Se você precisar ou desejar, atribua quaisquer
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 nula onDestroy
. Aparentemente, vazar o Activity
(pendurado nele depois de destruído) é um desperdício .. :)
Reserve um XML android:id
para uso no código
API 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
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Depois que o ViewGroup ou View for criado, você poderá anexar o ID personalizado
myViewGroup.setId(R.id.reservedNamedId);
id
Exemplo conflitante
Para maior clareza, por exemplo ofuscante, vamos examinar o que acontece quando há um id
conflito nos bastidores.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Para simular um conflito, digamos que nossa última compilação tenha atribuído R.id.placeholder
( @+id/placeholder
) um int
valor de 12
..
Em seguida, MyActivity.java define algumas visualizações adicionadas programaticamente (via código):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Então, placeholder
e um dos nossos novos TextView
s tem um id
de 12! Mas isso não é realmente um problema se consultarmos as visualizações de filhos do espaço reservado:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Não é tão ruim