Android id
Übersicht
Ein Android id
ist eine Ganzzahl, die häufig zum Identifizieren von Ansichten verwendet wird. Dies id
kann über XML (wenn möglich) und über Code (programmgesteuert) zugewiesen werden. Dies id
ist am nützlichsten, um Referenzen für XML-definierte View
s zu erhalten, die von einem generiert wurden Inflater
(z. B. mithilfe von setContentView
.).
Zuweisen id
überXML
- Fügen
android:id="@+id/
Sie "
Ihrer Ansicht ein Attribut mit einem Namen hinzu .
- Wenn Ihre Anwendung erstellt wird,
android:id
wird der eine eindeutige Funktion int
zur Verwendung im Code zugewiesen .
- Eingeben Ihres
android:id
‚s - int
Wert in Code‚ R.id.
somename‘(effektiv eine Konstante.)
- Dies
int
kann sich von Build zu Build ändern. Kopieren Sie daher niemals eine ID aus gen/
package.name/ R.java
. Verwenden R.id.
Sie einfach " somename".
- (Außerdem wird ein in XML
id
zugewiesenes Preference
nicht verwendet, wenn das Preference
seine generiert View
.)
Zuweisung id
per Code (programmgesteuert)
- Manuelles Setzen von
id
s mit someView.setId(
int);
- Das
int
muss positiv sein, ist aber ansonsten willkürlich - es kann alles sein, was Sie wollen (lesen Sie weiter, wenn dies schrecklich ist.)
- Wenn Sie beispielsweise mehrere Ansichten erstellen und nummerieren, die Elemente darstellen, können Sie deren Elementnummer verwenden.
Einzigartigkeit von id
s
XML
-zugewiesene id
s werden einzigartig sein.
- Code-zugewiesene
id
s müssen nicht eindeutig sein
- Code-zugewiesene
id
s können (theoretisch) mit XML
-zugewiesenen id
s in Konflikt stehen .
- Diese widersprüchlichen
id
s spielen keine Rolle, wenn sie korrekt abgefragt werden (lesen Sie weiter) .
Wann (und warum) Konflikte id
keine Rolle spielen
findViewById(int)
iteriert die Tiefe zuerst rekursiv durch die Ansichtshierarchie aus der von Ihnen angegebenen Ansicht und gibt die erste gefundene AnsichtView
mit einer Übereinstimmung zurück id
.
- Solange
id
vor einem id
in der Hierarchie definierten XML kein Code zugewiesen ist , findViewById(R.id.somename)
wird immer die XML-definierte Ansicht zurückgegeben id
.
Ansichten dynamisch erstellen und ID
s zuweisen
- Definieren Sie in Layout-XML ein Leerzeichen
ViewGroup
mit id
.
- Wie ein
LinearLayout
mit android:id="@+id/placeholder"
.
- Verwenden Sie Code, um den Platzhalter
ViewGroup
mit View
s zu füllen.
- Wenn Sie möchten oder möchten, weisen Sie
id
jeder Ansicht ein beliebiges s zu.
Fragen Sie diese untergeordneten Ansichten mit placeholder.findViewById (bequemeInt) ab.
API 17 wurde eingeführt View.generateViewId()
, mit der Sie eine eindeutige ID generieren können.
Wenn Sie Verweise auf Ihre Ansichten beibehalten möchten, müssen Sie diese instanziieren getApplicationContext()
und jeden Verweis auf null in setzen onDestroy
. Offenbar undichte das Activity
(hanging auf sie nach zerstört wird) ist verschwenderisch .. :)
Reservieren Sie ein XML android:id
zur Verwendung im Code
API 17 eingeführt View.generateViewId()
, die eine eindeutige ID generiert. (Dank an das Risiko, Änderungen vorzunehmen, um darauf hinzuweisen.) *
Wenn Sie ViewGroup
nicht über XML definiert werden können (oder nicht möchten), können Sie die ID über XML reservieren, um sicherzustellen, dass sie eindeutig bleibt:
Hier definiert values / ids.xml eine benutzerdefinierte Funktion id
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Sobald die ViewGroup oder View erstellt wurde, können Sie die benutzerdefinierte ID anhängen
myViewGroup.setId(R.id.reservedNamedId);
Widersprüchliches id
Beispiel
Lassen Sie uns zur Verdeutlichung anhand eines verschleierten Beispiels untersuchen, was passiert, wenn id
hinter den Kulissen ein Konflikt auftritt.
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>
Um einen Konflikt zu simulieren, nehmen wir an, unser letzter Build hat R.id.placeholder
( @+id/placeholder
) den int
Wert 12
.. zugewiesen .
Als Nächstes definiert MyActivity.java einige hinzugefügte Ansichten programmgesteuert (über Code):
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);
}
Also placeholder
und einer unserer neuen hat TextView
beide einen id
von 12! Dies ist jedoch kein wirkliches Problem, wenn wir die untergeordneten Ansichten des Platzhalters abfragen:
// 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);
*Nicht so schlecht