¿Cómo funciona el mapeo entre los recursos de android y el ID de recursos?
Es mágico para Android localizar el recurso adecuado sólo a través de la R.id.XXX .
AFAIK, los recursos se compilan en formato binario, así que ¿cómo funciona esta lógica de asignación bajo el capó?
- ¿Cómo usar diferentes imágenes de fondo para diferentes resoluciones en Android?
- ¿Cómo preparar el diseño, las carpetas dibujables para 7 ", 10" tabletas Android para el paisaje y el retrato?
- ¿Cómo puedo asignar un ID a una vista mediante programación?
- Error en la preparación de la excepción de aumento de jugador de Android: estado 0x1
- ¿Cómo puedo obtener el ID de recurso del icono de la aplicación en mi aplicación desde una API
Tal vez funciona así:
Por ejemplo, en el layout1.xml , tenemos:
<Button android:id="@+id/button1" >
Y AAPT generará esto en el R.java:
public static final int button1=0x7f05000b;
Cuando el * .apk es genrated, el @ + id / button1 con ser sustituido con "0x7f05000b".
Así, cuando llamamos:
findViewById(R.id.button1);
Esencialmente estamos haciendo la búsqueda basada en el ID, aunque el ID es un número como 0x7f05000b.
¡Gracias!
AÑADIR
Lo que realmente quiero saber, es cómo el entero de id de recurso se analiza en el contenido del recurso? En otras palabras, ¿cómo es que el tiempo de ejecución de Android localiza el contenido de recursos con id de recurso como la única pista?
Por ejemplo, ¿cómo se puede encontrar una imagen dibujable con un ID de recurso? ¿O cómo se encuentra un valor de cadena con un ID de recurso?
- Estilo Sherlock Barra de Acción
- ¿Cómo puedo resolver este error en Android? (Terminado con un valor distinto de cero)
- ¿Cuál es el uso del archivo res / values / public.xml en Android?
- Android Studio: Creación de diseños de paisaje
- Acceso a recursos e identificadores de recursos de otras aplicaciones
- Inclusión / exclusión de recursos condicionales para Android apk build
- ¿Cuál sería la configuración de recursos de Nexus 9 - 2014?
- Archivos de recursos de cadenas múltiples con claves similares en Android
En el momento de la compilación, la herramienta aapt recopila todos los recursos que ha definido (aunque archivos separados o definiciones explícitas en archivos) y les asigna ID de recursos.
Un ID de recurso es un número de 32 bits de la forma: PPTTNNNN. PP es el paquete del recurso; TT es el tipo de recurso; NNNN es el nombre del recurso de ese tipo. Para recursos de aplicaciones, PP siempre es 0x7f.
Los valores TT y NNNN son asignados arbitrariamente por aapt – básicamente para cada nuevo tipo se asigna y utiliza el siguiente número disponible (comenzando con 1); Del mismo modo para cada nuevo nombre en un tipo, se asigna y utiliza el siguiente número disponible (comenzando con 1).
Así que si tenemos estos archivos de recursos manejados por aapt en este orden:
layout/main.xml drawable/icon.xml layout/listitem.xml
El primer tipo que vemos es "disposición" de modo que se da TT == 1. El primer nombre bajo ese tipo es "principal" por lo que se da NNNN == 1. El ID de recurso final es 0x7f010001.
A continuación vemos "dibujable" por lo que se da TT == 2. El primer nombre para ese tipo es "icono" para que obtiene NNNN == 1. El ID de recurso final es 0x7f020001.
Por último vemos otro "layout" que tiene TT == 1 como antes. Esto tiene un nuevo nombre "listitem" para que obtiene el siguiente valor NNNN == 2. El ID de recurso final es 0x7f010002.
Tenga en cuenta que aapt por defecto no intenta mantener estos identificadores iguales entre las compilaciones. Cada vez que cambian los recursos, todos pueden obtener nuevos identificadores. Cada vez que se construyen, se crea un nuevo R.java con los identificadores actuales para que el código obtenga los valores correctos. Debido a esto, nunca debe identificar identificadores persistentes de recursos en ningún lugar donde puedan ser utilizados en diferentes compilaciones de su aplicación.
Una vez compilados los recursos y los identificadores asignados, aapt genera el archivo R.java para su código fuente y un archivo binario llamado "resources.arsc" que contiene todos los nombres de recursos, identificadores y valores (para recursos que vienen de archivos separados , Su valor es la ruta de acceso a ese archivo en el archivo .apk), en un formato que puede ser fácilmente mapeado y analizado en el dispositivo en tiempo de ejecución.
Puede obtener un resumen del archivo resources.arsc en un apk con el comando "aapt dump resources <path-to-apk>".
El formato de la tabla de recursos binarios se documenta en el archivo de encabezado para las estructuras de datos de recursos aquí:
https://github.com/android/platform_frameworks_base/blob/master/include/androidfw/ResourceTypes.h
La implementación completa para leer la tabla de recursos en el dispositivo está aquí:
https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp
Si está interesado en la implementación interna (lado del dispositivo) eche un vistazo a loadDrawable () en Resources.java . Consulte la excelente respuesta de hackbod para obtener información sobre cómo extraer datos de la tabla de recursos
Para saber cómo se traducen las presentaciones en View desde ID de recurso, consulte LayoutInfater .java
Por lo que entiendo, aapt generará automáticamente identificaciones únicas para cada uno de sus recursos y los almacenará en una tabla de consulta. Esta tabla de búsqueda se mantiene como el archivo "resources.arsc" ubicado en "bin / resources.ap_" (esto es sólo un archivo ZIP, así que siéntase libre de abrirlo usando su visor ZIP favorito). La tabla de búsqueda también se mantiene como R.java, que como usted sabe le permite hacer referencia a sus recursos en Java.
Si desea obtener más información sobre el archivo ARSC, sugeriría que Google lo busque o revise el código de http://code.google.com/p/android-apktool/ .
Decano
Una nota final: durante más tiempo, no utilicé diseños relativos porque muchos elementos necesitan referenciar elementos más abajo en el archivo xml, y no sabía cómo hacer referencia a un @ id / foo que no se había definido todavía.
<!-- doesn't work --> <TextView android:layout_above="@id/foo">above</textview> <TextView android:id="@+id/foo">below</textview>
Entonces un día me di cuenta (duh) que se puede definir un id en la referencia; No tiene que estar en el elemento que lleva el identificador:
<!-- works --> <TextView android:layout_above="@+id/foo">above</textview> <TextView android:id="@id/foo">below</textview>
La magia se encuentra en el complemento de Eclipse y el archivo R.java se autogenera en la carpeta "gen" de una aplicación. Si echas un vistazo a este archivo, verás las asignaciones estáticas para cada XXX en R.xx.XXX donde xx puede ser anim, matriz, color y cualquier otro tipo de recurso.
- Nexus 4 no muestra archivos a través de MTP
- Android ClassNotFoundException: No encontró la clase en el path