id
Panoramica di Android
Un Android id
è un numero intero comunemente usato per identificare le viste; questo id
può essere assegnato via XML (quando possibile) e via codice (programmaticamente). id
È più utile per ottenere riferimenti per View
s definiti da XML generati da un Inflater
(come usando setContentView
.)
Assegna id
viaXML
- Aggiungi un attributo di
android:id="@+id/
somename "
alla tua vista.
- Quando viene creata l'applicazione,
android:id
verrà assegnato un unico int
per l'uso nel codice.
- Riferimento tua
android:id
s' int
valore nel codice utilizzando "R.id.
nomeacaso'(in modo efficace una costante.)
- questo
int
può cambiare da build a build, quindi non copiare mai un ID da gen/
package.name/ R.java
, basta usare " R.id.
somename".
- (Inoltre, un
id
assegnato a un Preference
in XML non viene utilizzato quando Preference
genera il suo View
.)
Assegna id
tramite codice (a livello di codice)
- Impostare manualmente
id
usandosomeView.setId(
int);
- Il
int
deve essere positivo, ma è comunque arbitrario, infatti esso può essere quello che vuoi (continuate a leggere se questo è spaventoso.)
- Ad esempio, se si creano e si numerano più viste che rappresentano articoli, è possibile utilizzare il loro numero di articolo.
Unicità di id
s
XML
-signed id
s sarà unico.
- Codice assegnato
id
s non non devono essere univoci
- I messaggi assegnati in codice
id
possono (teoricamente) XML
entrare in conflitto con i messaggi assegnati id
.
- Questi messaggi in conflitto
id
non importeranno se interrogati correttamente (continua a leggere) .
Quando (e perché) i conflitti id
non contano
findViewById(int)
eseguirà l'iterazione della profondità in modo ricorsivo attraverso la gerarchia della vista dalla vista specificata e restituirà la prima View
che trova con una corrispondenza id
.
- Fintanto che non vi sono assegnazioni di codice
id
assegnate prima di un XML definito id
nella gerarchia, findViewById(R.id.somename)
verrà sempre restituita la vista definita in XML così id
'd.
Creazione dinamica di viste e assegnazione di messaggi di posta ID
elettronica
Se si sceglie di mantenere i riferimenti alle proprie visualizzazioni , accertarsi di crearle un'istanza getApplicationContext()
e assicurarsi di impostare ogni riferimento su null in onDestroy
. A quanto pare che perde il Activity
(appeso su di esso dopo che è stato distrutto) è uno spreco .. :)
Prenota un XML android:id
per l'uso nel codice
API 17 introdotta View.generateViewId()
che genera un ID univoco.(Grazie a prendere-possibilità-apportare modifiche per averlo sottolineato.) *
Se il tuo ViewGroup
non può essere definito tramite XML (o non vuoi che lo sia) puoi riservare l'id tramite XML per assicurarti che rimanga unico:
Qui, valori / ids.xml definisce un'abitudine id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Quindi, una volta creati il ViewGroup o View, è possibile collegare l'id personalizzato
myViewGroup.setId(R.id.reservedNamedId);
id
Esempio contrastante
Per chiarezza a titolo di esempio offuscante, esaminiamo cosa succede quando c'è un id
conflitto dietro le quinte.
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>
Per simulare un conflitto, supponiamo che il nostro ultimo build abbia assegnato R.id.placeholder
( @+id/placeholder
) un int
valore di 12
..
Successivamente, MyActivity.java definisce alcune visualizzazioni aggiunte a livello di codice (tramite codice):
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);
}
Quindi, placeholder
uno dei nostri nuovi ha TextView
entrambi id
12! Ma questo non è davvero un problema se interroghiamo le visualizzazioni figlio del segnaposto:
// 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);
*Non così male