Estoy agregando TextViews programáticamente en un ciclo for y los agrego a una ArrayList.
¿Cómo lo uso TextView.setId(int id)
? ¿Qué ID de entero se me ocurre para que no entre en conflicto con otras ID?
Estoy agregando TextViews programáticamente en un ciclo for y los agrego a una ArrayList.
¿Cómo lo uso TextView.setId(int id)
? ¿Qué ID de entero se me ocurre para que no entre en conflicto con otras ID?
De acuerdo con la View
documentación
El identificador no tiene que ser único en la jerarquía de esta vista. El identificador debe ser un número positivo.
Por lo tanto, puede usar cualquier número entero positivo que desee, pero en este caso puede haber algunas vistas con id equivalentes. Si desea buscar alguna vista en la jerarquía, llamar setTag
con algunos objetos clave puede ser útil.
findViewById
alguna garantía sobre qué vista se devuelve si hay más de una con la misma ID? Los documentos no mencionan nada.findViewById
, devolverá la primera que encuentre.setContentView()
tiene, digamos, 10 vistas con su ID establecido en el mismo número de identificación en la misma jerarquía , entonces una llamada afindViewById([repeated_id])
devolvería la primera vista establecida con esa identificación repetida. A eso me refería.Desde el nivel API 17 y superior, puede llamar a: View.generateViewId ()
Luego use View.setId (int) .
Si su aplicación está dirigida a un nivel inferior al API 17, use ViewCompat.generateViewId ()
fuente
AtomicInteger
implementación de métodos.for(;;)
lo que nunca había visto antes? ¿Cómo se llama eso?Puede establecer las ID que usará más adelante en la
R.id
clase utilizando un archivo de recursos xml y dejar que el SDK de Android les otorgue valores únicos durante el tiempo de compilación.Para usarlo en el código:
fuente
"int currentId = 1000; whateverView.setId(currentId++);
: eso incrementa la ID cada vez quecurrentId++
se usa, asegurando una ID única, y puedo almacenar el ID en mi ArrayList para acceso posterior.<resources>
.También puedes definirlo
ids.xml
enres/values
. Puede ver un ejemplo exacto en el código de muestra de Android.fuente
Desde API 17, la
View
clase tiene un método estáticogenerateViewId()
quefuente
Esto funciona para mi:
fuente
findViewById()
Es una operación lenta. El enfoque funciona, pero a costa del rendimiento.(Este fue un comentario a la respuesta del diletante pero se hizo demasiado largo ... jeje)
Por supuesto, aquí no se necesita una estática. Puede usar SharedPreferences para guardar, en lugar de static. De cualquier manera, la razón es guardar el progreso actual para que no sea demasiado lento para diseños complicados. Porque, de hecho, después de usarse una vez, será bastante rápido más tarde. Sin embargo, no creo que esta sea una buena manera de hacerlo porque si tiene que reconstruir su pantalla nuevamente (por ejemplo,
onCreate
se le llama nuevamente), entonces de todos modos probablemente quiera comenzar de nuevo, eliminando la necesidad de estática. Por lo tanto, simplemente conviértalo en una variable de instancia en lugar de estática.Aquí hay una versión más pequeña que se ejecuta un poco más rápido y podría ser más fácil de leer:
Esta función anterior debería ser suficiente. Porque, por lo que puedo decir, las ID generadas por Android están en miles de millones, por lo que probablemente esto regrese
1
la primera vez y siempre sea bastante rápido. Porque, en realidad, no estará pasando los ID utilizados para encontrar uno no utilizado. Sin embargo, el ciclo es allí si realmente encuentra una identificación usada.Sin embargo, si aún desea que se guarde el progreso entre recreaciones posteriores de su aplicación, y desea evitar el uso de estática. Aquí está la versión de SharedPreferences:
Esta respuesta a una pregunta similar debería decirle todo lo que necesita saber sobre ID con Android: https://stackoverflow.com/a/13241629/693927
EDITAR / ARREGLO: Acabo de darme cuenta de que me burlé por completo de guardar. Debo haber estado borracho.
fuente
La biblioteca 'Compat' ahora también admite el
generateViewId()
método para niveles de API anteriores al 17.Solo asegúrese de usar una versión de la
Compat
biblioteca que sea27.1.0+
Por ejemplo, en su
build.gradle
archivo, ponga:implementation 'com.android.support:appcompat-v7:27.1.1
Entonces puede simplemente usar el
generateViewId()
de laViewCompat
clase en lugar de laView
clase de la siguiente manera://Will assign a unique ID myView.id = ViewCompat.generateViewId()
¡Feliz codificación!
fuente
Solo una adición a la respuesta de @phantomlimb,
mientras que
View.generateViewId()
requiere Nivel API> = 17,esta herramienta es compatible con todas las API
según el nivel de API actual,
decide el clima usando la API del sistema o no.
para que pueda usar
ViewIdGenerator.generateViewId()
yView.generateViewId()
al mismo tiempo y no se preocupe por obtener la misma identificaciónfuente
for (;;) { … }
proviene del código fuente de Android.generateViewId()
else { return View.generateViewId(); }
¿Esto irá a bucle infinito para un nivel de API menor a 17 dispositivos?Para generar dinámicamente el formulario de Id. De vista API 17, use
generateViewId ()
Lo que generará un valor adecuado para su uso en
setId(int)
. Este valor no colisionará con los valores de ID generados en tiempo de compilación por aapt forR.id
.fuente
...
fuente
Yo suelo:
Al usar un número aleatorio siempre tengo una gran posibilidad de obtener la identificación única en el primer intento.
fuente
fuente
Mi elección:
fuente