¿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.
- Android: Personajes dejados atrás en EditText
- Android: ListView no muestra ningún resultado
- Las sugerencias de auto de EditText están en blanco o no existen
- Cómo establecer una matriz como etiqueta a cualquier vista a través de diseño xml en android
- ¿Cómo agregar un grupo de radio a los botones de radio dentro de una tabla?
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?
- Aplicar filtro de color con xml en ImageView
- ¿Cómo se consigue dimension.xml (sw600dp) en Android Studio?
- Android: Cómo crear CursorAdapter desde los datos en un archivo XML
- Equivalencia de setTag (clave, valor) en XML
- Android onfocuschange en xml
- Java.lang.NullPointerException: Intenta invocar el método virtual 'ActionBar.setNavigationMode (int)' en una referencia de objeto nulo
- ERROR: La instrucción de proceso que coincide con " " no está permitida
- Número máximo de selecciones MultiSelectListPreference Android
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