In einer XML-Datei können wir einer Ansicht wie eine ID zuweisen android:id="@+id/something"
und dann aufrufen. findViewById()
Wie kann ich beim programmgesteuerten Erstellen einer Ansicht eine ID zuweisen?
Ich denke, das setId()
ist nicht dasselbe wie die Standardzuweisung. setId()
ist extra.
Kann mich jemand korrigieren?
Antworten:
Android
id
ÜbersichtEin Android
id
ist eine Ganzzahl, die häufig zum Identifizieren von Ansichten verwendet wird. Diesid
kann über XML (wenn möglich) und über Code (programmgesteuert) zugewiesen werden. Diesid
ist am nützlichsten, um Referenzen für XML-definierteView
s zu erhalten, die von einem generiert wurdenInflater
(z. B. mithilfe vonsetContentView
.).Zuweisen
id
überXML
android:id="@+id/
Sie"
Ihrer Ansicht ein Attribut mit einem Namen hinzu .android:id
wird der eine eindeutige Funktionint
zur Verwendung im Code zugewiesen .android:id
‚s -int
Wert in Code‚R.id.
somename‘(effektiv eine Konstante.)int
kann sich von Build zu Build ändern. Kopieren Sie daher niemals eine ID ausgen/
package.name/R.java
. VerwendenR.id.
Sie einfach " somename".id
zugewiesenesPreference
nicht verwendet, wenn dasPreference
seine generiertView
.)Zuweisung
id
per Code (programmgesteuert)id
s mitsomeView.setId(
int);
int
muss positiv sein, ist aber ansonsten willkürlich - es kann alles sein, was Sie wollen (lesen Sie weiter, wenn dies schrecklich ist.)Einzigartigkeit von
id
sXML
-zugewieseneid
s werden einzigartig sein.id
s müssen nicht eindeutig seinid
s können (theoretisch) mitXML
-zugewiesenenid
s in Konflikt stehen .id
s spielen keine Rolle, wenn sie korrekt abgefragt werden (lesen Sie weiter) .Wann (und warum) Konflikte
id
keine Rolle spielenfindViewById(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ückid
.id
vor einemid
in der Hierarchie definierten XML kein Code zugewiesen ist ,findViewById(R.id.somename)
wird immer die XML-definierte Ansicht zurückgegebenid
.Ansichten dynamisch erstellen und
ID
s zuweisenViewGroup
mitid
.LinearLayout
mitandroid:id="@+id/placeholder"
.ViewGroup
mitView
s zu füllen.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 setzenonDestroy
. Offenbar undichte dasActivity
(hanging auf sie nach zerstört wird) ist verschwenderisch .. :)Reservieren Sie ein XML
android:id
zur Verwendung im CodeAPI 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
:Sobald die ViewGroup oder View erstellt wurde, können Sie die benutzerdefinierte ID anhängen
Widersprüchliches
id
BeispielLassen Sie uns zur Verdeutlichung anhand eines verschleierten Beispiels untersuchen, was passiert, wenn
id
hinter den Kulissen ein Konflikt auftritt.layout / mylayout.xml
Um einen Konflikt zu simulieren, nehmen wir an, unser letzter Build hat
R.id.placeholder
(@+id/placeholder
) denint
Wert12
.. zugewiesen .Als Nächstes definiert MyActivity.java einige hinzugefügte Ansichten programmgesteuert (über Code):
Also
placeholder
und einer unserer neuen hatTextView
beide einenid
von 12! Dies ist jedoch kein wirkliches Problem, wenn wir die untergeordneten Ansichten des Platzhalters abfragen:*Nicht so schlecht
quelle
findViewById
eine Tiefenerkundung durchgeführt wird. "Solange keine Code-zugewiesenen IDs über einer XML-definierten ID in der Hierarchie zugewiesen sind", ist technisch nicht korrekt. Es ist "vor" und nicht "über".ids.xml
. Verwenden Sie für wirklich beliebige IDsView.generateViewId()
(API 17). (Bitte klären Sie Ihren Punkt, wenn ich ihn verpasst habe.)PreferenceDialogFragmentCompat
davon, als ob IDs vonR.id
nicht mit der Ansichtshierarchie übereinstimmen. Auf diese Weise kann ich die Ansicht nicht anhand der ID finden.Sie können das einfach dafür verwenden
View.setId(integer)
. Obwohl Sie im XML eine String-ID festlegen, wird diese in eine Ganzzahl konvertiert. Aus diesem Grund können Sie eine beliebige (positive) Ganzzahl für dasViews
programmgesteuerte Hinzufügen verwenden.Dank an diese Antwort .
quelle
Ja, Sie können
setId(value)
jede Ansicht mit einem beliebigen (positiven) Ganzzahlwert aufrufen und ihn dann im übergeordneten Container mit findenfindViewById(value)
. Beachten Sie, dass es gültig ist,setId()
für verschiedene Geschwisteransichten mit demselben Wert aufzurufen , aberfindViewById()
nur die erste zurückgibt.quelle
findViewById
einen bekannten Vorfahren anzurufen ist aus Leistungsgründen eine gute Idee, aber es garantiert nicht, dass ein unmittelbares Kind gefunden wird, wenn es eines mit der richtigen ID gibt.