id
Resumen de Android
Un Android id
es un número entero comúnmente usado para identificar vistas; esto id
se puede asignar a través de XML (cuando sea posible) y a través de código (mediante programación). Esto id
es más útil para obtener referencias para View
s definidos por XML generados por un Inflater
(como mediante el uso setContentView
).
Asignar id
víaXML
- Agregue un atributo de
android:id="@+id/
somename "
a su vista.
- Cuando se compila su aplicación,
android:id
se le asignará un único int
para su uso en el código.
- Una referencia a su
android:id
's int
valor en el código usando ' R.id.
algunnombre'(efectivamente una constante).
- esto
int
puede cambiar de compilación a compilación, así que nunca copie una identificación de gen/
package.name/ R.java
, solo use " R.id.
somename".
- (Además, un
id
asignado a un Preference
en XML no se usa cuando el Preference
genera su View
.)
Asignar id
mediante código (mediante programación)
- Establecer manualmente
id
s usando someView.setId(
int);
- El
int
debe ser positivo, pero por lo demás arbitrary- puede ser lo que quiera (sigue leyendo si esto es espantoso.)
- Por ejemplo, si crea y numera varias vistas que representan elementos, puede usar su número de elemento.
Singularidad de id
s
XML
-s asignados id
serán únicos.
- Código asignado
id
s qué no tienen que ser únicos
- Los
id
s asignados por código pueden (en teoría) entrar en conflicto con los s XML
asignados id
.
- Estos
id
s conflictivos no importan si se consultan correctamente (sigue leyendo) .
Cuando (y por qué) id
s conflictivos no importan
findViewById(int)
iterará primero en profundidad recursivamente a través de la jerarquía de vistas desde la Vista que especifique y devolverá el primero View
que encuentre con una coincidencia id
.
- Siempre que no haya ningún código asignado
id
asignado antes de un XML definido id
en la jerarquía, findViewById(R.id.somename)
siempre devolverá la Vista definida por XML así que id
'd.
Crear dinámicamente vistas y asignar ID
s
- En el diseño XML, defina un vacío
ViewGroup
con id
.
- Tal como un
LinearLayout
con android:id="@+id/placeholder"
.
- Use el código para llenar el marcador de posición
ViewGroup
con View
s.
- Si lo necesita o lo desea, asigne los correos
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 nula onDestroy
. Al parecer, se escapa el Activity
(suben encima después de que se se destruye) es un desperdicio .. :)
Reserve un XML android:id
para usar en el código
API 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
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Luego, una vez que se ha creado ViewGroup o View, puede adjuntar la identificación personalizada
myViewGroup.setId(R.id.reservedNamedId);
id
Ejemplo conflictivo
Para mayor claridad a modo de ejemplo ofuscante, examinemos lo que sucede cuando hay un id
conflicto detrás de escena.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Para simular un conflicto, digamos que nuestra última compilación asignó R.id.placeholder
( @+id/placeholder
) un int
valor de 12
..
A continuación, MyActivity.java define algunas vistas añadidas mediante programación (a través del código):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
¡ placeholder
Y uno de nuestros nuevos TextView
s tiene un id
12! Pero esto no es realmente un problema si consultamos las vistas secundarias del marcador de posición:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*No es tan malo