¿Cómo asignar id únicos a las vistas creadas dinámicamente?
En mi aplicación estoy creando Views
– en este caso un EditText
– dinámicamente. Pero cada View
que agrego necesita tener un identificador único.
EditText editText = new EditText(context); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); editText.setLayoutParams(params); // Which value am I supposed to use here? editText.setId(value); layout.addView(editText);
Tengo miedo de los conflictos si asigno un valor aleatorio y no puedo pensar en ninguna forma de generar ids sin la posibilidad de conflictos.
- ScrollView corta la parte superior y deja espacio en la parte inferior
- Android Studio: Problemas de renderización
- ¿Cómo puedo configurar espacios de nombres personalizados en el archivo de diseño en Android Studio?
- Xml extraer elementos del analizador xml
- Android convertir vista XML a mapa de bits sin mostrarlo
Por favor, no que sé que se puede definir un conjunto fijo de ids en res / values / ids.xml, pero eso no es lo que quiero! ¡Necesito crear los ids dinámicamente! No tengo idea de cuántos necesito.
Entonces, ¿hay alguna manera segura de generar IDs?
- Error en styles.xml en android-support-v7-mediarouter
- ¿Cómo emitir un mensaje de confirmación (sí / no) de una tarea de Android?
- Archivo binario línea # 7: Debe proporcionar un atributo layout_width
- El soporte de diseño de derecha a izquierda está causando problemas de advertencia en el editor de xml
- ADT de Android: no fragment_main.xml, sólo activity_main.xml
- RecyclerView wrap_content
- Cómo eliminar el borde en el diseño
- Editar texto dentro de la vista de desplazamiento no se puede desplazar
Asignar id
mediante código (mediante programación)
- Configurar manualmente los
id
usandosomeView.setId(
int);
- El
int
debe ser positivo, pero de lo contrario arbitrario, puede ser lo que quieras (sigue leyendo si esto es espantoso.) - Por ejemplo, si crea y numeró varias vistas que representan elementos, podría utilizar su número de artículo.
Normalmente lo hacemos:
Para asignar id –
for(int i =0 ; i < yourIDcount ; i++){ yourView.setId(i); }
Para obtener id –
View.findViewById(yourView.getId());
También,
API 17
introdujo View.generateViewId()
que genera una ID única.
Comprobar:
How-can-i-assign-an-id-to-a-view-programmatically y android-assign-and-retrieve-ids-dinámicamente .
Hay varias formas en las que puede generar ids de forma fiable para sus Views
. Algunos pueden ser utilizados para generar dinámicamente ids en tiempo de ejecución, otros pueden ser utilizados para definir de forma estática un número fijo de ids. Voy a repasar algunas soluciones en esta respuesta.
Creación estática de un número fijo de ids
Cree un nuevo archivo xml en res / values llamado ids.xml y añada elementos con el tipo id:
<?xml version="1.0" encoding="utf-8"?> <resources> <item name="name" type="id" /> <!-- Creates the id R.id.name --> <item name="example" type="id" /> <!-- Creates the id R.id.example --> </resources>
¡También puedes generar IDs para otros recursos! Sólo cambia el tipo.
Generación dinámica de identificadores desde el nivel API 17+
Con el nivel 17 de API, se agregó un nuevo método a la clase View
:
int id = View.generateViewId();
¡Con él usted puede crear tantos ids como usted necesita dinámicamente!
Generación dinámica de identificadores antes del nivel API 17
Como @Apoorv sugirió que puede ver el código fuente de generateViewId()
aquí . Al copiar el código, podemos usar este método incluso antes del nivel 17 de la API:
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); public static int generateViewId() { for (; ; ) { final int result = sNextGeneratedId.get(); // aapt-generated IDs have the high byte nonzero; clamp to the range under that. int newValue = result + 1; if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. if (sNextGeneratedId.compareAndSet(result, newValue)) { return result; } } }
¡Apenas incluyelo en una clase del ayudante y usted está todo fijado!
- AppCompat y EditText subrayado diferente en diferentes API
- No puede encontrar la ubicación exacta actual en android