Ich füge TextViews programmgesteuert in einer for-Schleife hinzu und füge sie einer ArrayList hinzu.
Wie benutze ich TextView.setId(int id)
? Welche Ganzzahl-ID habe ich, damit sie nicht mit anderen IDs in Konflikt steht?
Ich füge TextViews programmgesteuert in einer for-Schleife hinzu und füge sie einer ArrayList hinzu.
Wie benutze ich TextView.setId(int id)
? Welche Ganzzahl-ID habe ich, damit sie nicht mit anderen IDs in Konflikt steht?
Laut View
Dokumentation
Der Bezeichner muss in der Hierarchie dieser Ansicht nicht eindeutig sein. Die Kennung sollte eine positive Zahl sein.
Sie können also eine beliebige positive Ganzzahl verwenden. In diesem Fall kann es jedoch einige Ansichten mit entsprechenden IDs geben. Wenn Sie nach einer Ansicht in der Hierarchie suchen möchten, setTag
kann das Aufrufen mit einigen Schlüsselobjekten hilfreich sein.
findViewById
dann irgendwelche Garantien dafür, welche Ansicht zurückgegeben wird, wenn es mehr als eine mit derselben ID gibt? Die Dokumente erwähnen nichts.findViewById
wird die erste gefundene zurückgegeben.setContentView()
haben, beispielsweise 10 Ansichten mit derselben ID auf dieselbe ID-Nummer in derselben Hierarchie festgelegt hat , ein Aufruf vonfindViewById([repeated_id])
die erste Ansicht zurückgibt, die mit dieser einen wiederholten ID festgelegt wurde. Das ist es was ich meinte.Ab API-Level 17 und höher können Sie Folgendes aufrufen: View.generateViewId ()
Verwenden Sie dann View.setId (int) .
Wenn Ihre App auf eine niedrigere Stufe als API-Stufe 17 ausgerichtet ist, verwenden Sie ViewCompat.generateViewId ()
quelle
AtomicInteger
Methodenimplementierung an.for(;;)
habe ich noch nie gesehen? Wie heißt das?Sie können IDs, die Sie später im
R.id
Unterricht verwenden, mithilfe einer XML-Ressourcendatei festlegen und das Android SDK während der Kompilierungszeit eindeutige Werte festlegen lassen.So verwenden Sie es im Code:
quelle
"int currentId = 1000; whateverView.setId(currentId++);
- Das erhöht die ID bei jedercurrentId++
Verwendung, stellt eine eindeutige ID sicher und ich kann die speichern IDs in meiner ArrayList für den späteren Zugriff.<resources>
.Auch können Sie festlegen ,
ids.xml
inres/values
. Sie können ein genaues Beispiel im Beispielcode von Android sehen.quelle
Da 17 - API, die
View
hat Klasse eine statische MethodegenerateViewId()
das wirdquelle
Das funktioniert bei mir:
quelle
findViewById()
ist eine langsame Operation. Der Ansatz funktioniert, jedoch auf Kosten der Leistung.(Dies war ein Kommentar zu Dilettantes Antwort, aber es wurde zu lang ... hehe)
Natürlich wird hier keine Statik benötigt. Sie können SharedPreferences zum Speichern anstelle von statischen verwenden. In beiden Fällen besteht der Grund darin, den aktuellen Fortschritt so zu speichern, dass er für komplizierte Layouts nicht zu langsam ist. Denn in der Tat wird es nach seiner einmaligen Verwendung später ziemlich schnell sein. Ich glaube jedoch nicht, dass dies ein guter Weg ist, dies zu tun, denn wenn Sie Ihren Bildschirm erneut erstellen müssen (z
onCreate
erstellen müssen (z. wird er erneut aufgerufen), möchten Sie wahrscheinlich trotzdem von vorne beginnen, sodass keine statische Aufladung erforderlich ist. Machen Sie es daher einfach zu einer Instanzvariablen anstelle einer statischen.Hier ist eine kleinere Version, die etwas schneller läuft und möglicherweise leichter zu lesen ist:
Diese obige Funktion sollte ausreichend sein. Weil, soweit ich das beurteilen kann, von Android generierte IDs in Milliardenhöhe liegen, wird dies wahrscheinlich
1
das erste Mal zurückkehren und immer recht schnell sein. Weil es nicht an den verwendeten IDs vorbeischleift, um eine nicht verwendete zu finden. Die Schleife ist jedoch vorhanden, wenn tatsächlich eine verwendete ID gefunden wird.Wenn Sie jedoch weiterhin möchten, dass der Fortschritt zwischen den nachfolgenden Neuerstellungen Ihrer App gespeichert wird, und die Verwendung von statischer Aufladung vermeiden möchten. Hier ist die SharedPreferences-Version:
Diese Antwort auf eine ähnliche Frage sollte Ihnen alles sagen, was Sie über IDs mit Android wissen müssen: https://stackoverflow.com/a/13241629/693927
EDIT / FIX: Ich habe gerade festgestellt, dass ich den Save total vermasselt habe. Ich muss betrunken gewesen sein.
quelle
Die 'Compat'-Bibliothek unterstützt jetzt auch die
generateViewId()
Methode für API-Level vor 17.Stellen Sie einfach sicher, dass Sie eine Version der
Compat
Bibliothek verwenden27.1.0+
Fügen Sie beispielsweise in Ihre
build.gradle
Datei Folgendes ein:implementation 'com.android.support:appcompat-v7:27.1.1
Dann können Sie einfach die
generateViewId()
aus derViewCompat
Klasse anstelle derView
Klasse wie folgt verwenden://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Viel Spaß beim Codieren!
quelle
Nur eine Ergänzung zur Antwort von @phantomlimb,
während
View.generateViewId()
API Level> = 17 erforderlich ist,ist dieses Tool Compatibe mit allen API.
Je nach aktuellem API-Level wird
das Wetter mithilfe der System-API entschieden oder nicht.
So können Sie
ViewIdGenerator.generateViewId()
undView.generateViewId()
in der gleichen Zeit verwenden und müssen sich keine Sorgen machen, dass Sie dieselbe ID erhaltenquelle
for (;;) { … }
stammt aus dem Android-Quellcode.generateViewId()
else { return View.generateViewId(); }
Dies wird eine Endlosschleife für API-Level kleiner als 17 Geräte?Verwenden Sie zum dynamischen Generieren der View ID Form API 17
generateViewId ()
Dadurch wird ein Wert generiert, der für die Verwendung in geeignet ist
setId(int)
. Dieser Wert kollidiert nicht mit ID-Werten, die zur Erstellungszeit von aapt for generiert wurdenR.id
.quelle
...
quelle
Ich benutze:
Durch die Verwendung einer Zufallszahl habe ich immer eine große Chance, die eindeutige ID im ersten Versuch zu erhalten.
quelle
quelle
Meine Wahl:
quelle