¿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.

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?

Asignar id mediante código (mediante programación)

  • Configurar manualmente los id usando someView.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!

  • Java / Android obtener matriz de xml
  • El documento no tiene excepción de elemento raíz utilizando el serializador xml simple (v2.6.6)
  • A xmlns: android, ¿cómo funciona eso realmente?
  • Android gradle src / androidTest / res / diseño / mylayout.xml no se encuentra en mypackage.R
  • Variables en los recursos XML: pasa valores de padres a hijos
  • Fallo Android Studio
  • set Selector for Button Programmatically issues
  • Ningún recurso encontrado que coincida con el nombre dado en layout_hint
  • intento androide no activar
  • LinearLayout: Alineación a la derecha del padre
  • XML Splash Screen -> Mostrar la Webview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.