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:
id
Resumen de AndroidUn Android
id
es un número entero comúnmente usado para identificar vistas; estoid
se puede asignar a través de XML (cuando sea posible) y a través de código (mediante programación). Estoid
es más útil para obtener referencias paraView
s definidos por XML generados por unInflater
(como mediante el usosetContentView
).Asignar
id
víaXML
android:id="@+id/
somename"
a su vista.android:id
se le asignará un únicoint
para su uso en el código.android:id
'sint
valor en el código usando 'R.id.
algunnombre'(efectivamente una constante).int
puede cambiar de compilación a compilación, así que nunca copie una identificación degen/
package.name/R.java
, solo use "R.id.
somename".id
asignado a unPreference
en XML no se usa cuando elPreference
genera suView
.)Asignar
id
mediante código (mediante programación)id
s usandosomeView.setId(
int);
int
debe ser positivo, pero por lo demás arbitrary- puede ser lo que quiera (sigue leyendo si esto es espantoso.)Singularidad de
id
sXML
-s asignadosid
serán únicos.id
s qué no tienen que ser únicosid
s asignados por código pueden (en teoría) entrar en conflicto con los sXML
asignadosid
.id
s conflictivos no importan si se consultan correctamente (sigue leyendo) .Cuando (y por qué)
id
s 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 primeroView
que encuentre con una coincidenciaid
.id
asignado antes de un XML definidoid
en la jerarquía,findViewById(R.id.somename)
siempre devolverá la Vista definida por XML así queid
'd.Crear dinámicamente vistas y asignar
ID
sViewGroup
conid
.LinearLayout
conandroid:id="@+id/placeholder"
.ViewGroup
conView
s.id
electró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:id
para 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
ViewGroup
no 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
id
Ejemplo conflictivoPara mayor claridad a modo de ejemplo ofuscante, examinemos lo que sucede cuando hay un
id
conflicto detrás de escena.layout / mylayout.xml
Para simular un conflicto, digamos que nuestra última compilación asignó
R.id.placeholder
(@+id/placeholder
) unint
valor de12
..A continuación, MyActivity.java define algunas vistas añadidas mediante programación (a través del código):
¡
placeholder
Y uno de nuestros nuevosTextView
s tiene unid
12! Pero esto no es realmente un problema si consultamos las vistas secundarias del marcador de posición:*No es tan malo
fuente
findViewById
hace 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.id
no 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) paraViews
agregar 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
findViewById
a 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.