idResumen de Android
Un Android ides un número entero comúnmente usado para identificar vistas; esto idse puede asignar a través de XML (cuando sea posible) y a través de código (mediante programación). Esto ides más útil para obtener referencias para Views definidos por XML generados por un Inflater(como mediante el uso setContentView).
Asignar idvíaXML
- Agregue un atributo de
android:id="@+id/somename "a su vista.
- Cuando se compila su aplicación,
android:idse le asignará un único int para su uso en el código.
- Una referencia a su
android:id's intvalor en el código usando ' R.id.algunnombre'(efectivamente una constante).
- esto
intpuede 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
idasignado a un Preferenceen XML no se usa cuando el Preferencegenera su View.)
Asignar idmediante código (mediante programación)
- Establecer manualmente
ids usando someView.setId(int);
- El
intdebe 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 ids
XML-s asignados idserán únicos.
- Código asignado
ids qué no tienen que ser únicos
- Los
ids asignados por código pueden (en teoría) entrar en conflicto con los s XMLasignados id.
- Estos
ids conflictivos no importan si se consultan correctamente (sigue leyendo) .
Cuando (y por qué) ids 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 Viewque encuentre con una coincidencia id.
- Siempre que no haya ningún código asignado
idasignado antes de un XML definido iden la jerarquía, findViewById(R.id.somename)siempre devolverá la Vista definida por XML así que id'd.
Crear dinámicamente vistas y asignar IDs
- En el diseño XML, defina un vacío
ViewGroupcon id.
- Tal como un
LinearLayoutcon android:id="@+id/placeholder".
- Use el código para llenar el marcador de posición
ViewGroupcon Views.
- Si lo necesita o lo desea, asigne los correos
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 nula onDestroy. Al parecer, se escapa el Activity(suben encima después de que se se destruye) es un desperdicio .. :)
Reserve un XML android:idpara 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 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:
<?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);
idEjemplo conflictivo
Para mayor claridad a modo de ejemplo ofuscante, examinemos lo que sucede cuando hay un idconflicto 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 intvalor 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);
}
¡ placeholderY uno de nuestros nuevos TextViews tiene un id12! 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