En un archivo XML, podemos asignar una ID a una vista como android:id="@+id/something"y luego llamar findViewById(), pero al crear una vista mediante programación, ¿cómo asigno una ID?
Creo que setId()no es lo mismo que la asignación predeterminada. setId()es extra
¿Alguien puede corregirme?

Respuestas:
idResumen de AndroidUn Android
ides un número entero comúnmente usado para identificar vistas; estoidse puede asignar a través de XML (cuando sea posible) y a través de código (mediante programación). Estoides más útil para obtener referencias paraViews definidos por XML generados por unInflater(como mediante el usosetContentView).Asignar
idvíaXMLandroid:id="@+id/somename"a su vista.android:idse le asignará un únicointpara su uso en el código.android:id'sintvalor en el código usando 'R.id.algunnombre'(efectivamente una constante).intpuede cambiar de compilación a compilación, así que nunca copie una identificación degen/package.name/R.java, solo use "R.id.somename".idasignado a unPreferenceen XML no se usa cuando elPreferencegenera suView.)Asignar
idmediante código (mediante programación)ids usandosomeView.setId(int);intdebe ser positivo, pero por lo demás arbitrary- puede ser lo que quiera (sigue leyendo si esto es espantoso.)Singularidad de
idsXML-s asignadosidserán únicos.ids qué no tienen que ser únicosids asignados por código pueden (en teoría) entrar en conflicto con los sXMLasignadosid.ids conflictivos no importan si se consultan correctamente (sigue leyendo) .Cuando (y por qué)
ids conflictivos no importanfindViewById(int)iterará primero en profundidad recursivamente a través de la jerarquía de vistas desde la Vista que especifique y devolverá el primeroViewque encuentre con una coincidenciaid.idasignado antes de un XML definidoiden la jerarquía,findViewById(R.id.somename)siempre devolverá la Vista definida por XML así queid'd.Crear dinámicamente vistas y asignar
IDsViewGroupconid.LinearLayoutconandroid:id="@+id/placeholder".ViewGroupconViews.idelectrónicos que sean convenientes para cada vista.Consulte estas vistas secundarias utilizando placeholder.findViewById (convenienteInt);
Se introdujo la API 17,
View.generateViewId()que le permite generar una identificación única.Si elige mantener referencias a sus vistas , asegúrese de crear instancias con ellas
getApplicationContext()y asegúrese de establecer cada referencia como nulaonDestroy. Al parecer, se escapa elActivity(suben encima después de que se se destruye) es un desperdicio .. :)Reserve un XML
android:idpara usar en el códigoAPI 17 introducida
View.generateViewId()que genera una identificación única. (Gracias a los riesgos de hacer cambios por señalar esto). *Si
ViewGroupno puede definirse a través de XML (o no desea que sea), puede reservar la identificación a través de XML para asegurarse de que siga siendo única:Aquí, values / ids.xml define una costumbre
id:Luego, una vez que se ha creado ViewGroup o View, puede adjuntar la identificación personalizada
idEjemplo conflictivoPara mayor claridad a modo de ejemplo ofuscante, examinemos lo que sucede cuando hay un
idconflicto detrás de escena.layout / mylayout.xml
Para simular un conflicto, digamos que nuestra última compilación asignó
R.id.placeholder(@+id/placeholder) unintvalor de12..A continuación, MyActivity.java define algunas vistas añadidas mediante programación (a través del código):
¡
placeholderY uno de nuestros nuevosTextViews tiene unid12! Pero esto no es realmente un problema si consultamos las vistas secundarias del marcador de posición:*No es tan malo
fuente
findViewByIdhace una exploración profunda primero, por lo que "siempre y cuando no haya identificadores asignados por código asignados por encima de una identificación definida por XML en la jerarquía" no es técnicamente correcto; es "antes" en lugar de "arriba".ids.xml. Para identificaciones verdaderamente arbitrarias, useView.generateViewId()(API 17). (Por favor aclare su punto si me lo he perdido.)PreferenceDialogFragmentCompatél parece que los identificadores deR.idno coinciden con la jerarquía de vistas. De esta manera no puedo encontrar la vista por ID.Puedes usar el
View.setId(integer)para esto. En el XML, aunque esté configurando un ID de cadena, este se convierte en un entero. Debido a esto, puede usar cualquier número entero (positivo) paraViewsagregar mediante programación.Créditos a esta respuesta .
fuente
Sí, puede llamar
setId(value)en cualquier vista con cualquier valor entero (positivo) que desee y luego encontrarlo en el contenedor principal utilizandofindViewById(value). Tenga en cuenta que es válido llamarsetId()con el mismo valor para diferentes vistas de hermanos, perofindViewById()solo devolverá la primera.fuente
findViewByIda un antepasado conocido es una buena idea por razones de rendimiento, pero no garantiza que encontrará un hijo inmediato si hay uno con la identificación correcta.