studio - manual de programacion android
¿Para qué sirve el archivo res/values/public.xml en Android? (3)
¿No es un archivo solo para los autores de uso del código del sistema operativo para definir una asignación entre los nombres simbólicos y los identificadores de recursos del sistema?
Lo encontrará en su SDK en YOUR_SDK_LOCATION / platforms / android - ?? / data / res / values.
Está dirigido
Este archivo define los recursos públicos básicos exportados por la plataforma, que siempre debe existir
y tiene la advertencia:
NOTA IMPORTANTE PARA CUALQUIER PERSONA QUE MODIFICA ESTE ARCHIVO LEA ESTO ANTES DE HACER CUALQUIER CAMBIO
Este archivo define la compatibilidad binaria para los recursos. Como tal, debes ser muy cuidadoso cuando realices cambios aquí, o romperás por completo la compatibilidad con aplicaciones anteriores
Tiene entradas tales como
<public type="attr" name="smallScreens" id="0x01010284" />
<public type="attr" name="normalScreens" id="0x01010285" />
<public type="attr" name="largeScreens" id="0x01010286" />
en él, todos los identificadores de resurtido del sistema, por lo que cualquier cambio de entradas romperá su código, de modo que no se ejecutará en un dispositivo estándar.
He buscado en Google, pero no pude encontrar ningún resultado relevante.
También revisé los documentos oficiales de Android y esta página (para todos los recursos disponibles) fue todo lo que pude encontrar. Los enlaces relevantes (al directorio res/values/
) que encontré en esta página fueron:
Estas páginas no dicen nada sobre el archivo res/values/public.xml
.
Aquí hay un ejemplo que encontré para este tipo de archivo .
Pequeño fragmento
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="attr" name="commentTextColor" id="0xAA010007" />
<public type="drawable" name="add_icon_bl" id="0xAA020000" />
<public type="layout" name="act_date_picker" id="0xAA030001" />
<public type="anim" name="activity_slide_from_bottom" id="0xAA040000" />
<public type="xml" name="pref_menu" id="0xAA050000" />
<public type="raw" name="alert_bell_animation_bl" id="0xAA060000" />
<public type="array" name="taskRepeat" id="0xAA070000" />
<public type="color" name="theme_main_color_bl" id="0xAA080000" />
<public type="string" name="no_internet" id="0xAA0a0001" />
<public type="id" name="page1" id="0xAA0d0015" />
</resources>
Como puede ver en el atributo type
, contiene prácticamente todos los tipos de recursos estándar que normalmente coloca en directorios separados en el directorio res
...
¿Por qué querría uno hacer un mal uso de los directorios que proporciona Android y usar un único archivo para almacenar todos los valores? ¿Alguien puede dar más información sobre esto?
El archivo res / values / public.xml se usa para asignar identificadores de recursos fijos a recursos de Android.
Considere este conjunto de recursos de cadena en res / values / strings.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string1">String 1</string>
<string name="string3">String 3</string>
</resources>
La herramienta de empaquetado de activos de Android (aapt) puede asignar los siguientes ID de recursos para estos recursos cuando se compila la aplicación:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string3=0x7f040001;
}
}
Ahora, cambie el conjunto de recursos de cadena a
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="string1">String 1</string>
<string name="string2">String 2</string>
<string name="string3">String 3</string>
</resources>
y notará que la identificación del recurso para @string/string3
ha cambiado:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string2=0x7f040001;
public static final int string3=0x7f040002; // New ID! Was 0x7f040001
}
}
Para evitar esto, puede usar res / values / public.xml :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<public type="string" name="string3" id="0x7f040001" />
</resources>
lo que dará como resultado que los ID de recursos se asignen de la siguiente manera:
public final class R {
// ...
public static final class string {
public static final int string1=0x7f040000;
public static final int string2=0x7f040002;
public static final int string3=0x7f040001; // Resource ID from public.xml
}
}
Las aplicaciones raramente tienen uso para res / values / public.xml ya que los ID de recursos asignados a los recursos no importan. Cuando cambian, toda la aplicación se reconstruye de todos modos, por lo que se actualizarán todas las referencias en el código de Java a recursos por ID de recurso.
El usuario más importante de res / values / public.xml es la plataforma Android en sí. Las aplicaciones creadas con versiones anteriores de Android asumen que ciertos recursos tienen una determinada identificación de recursos. Por ejemplo, el recurso de Android @android:style/Theme
siempre debe tener el ID de recurso 0x01030005 para que la plataforma sea compatible con aplicaciones desarrolladas en versiones anteriores de la plataforma.
Si le interesan más detalles sobre cómo se asignan las ID de recursos, consulte esta respuesta: ¿Cómo funciona la asignación entre los recursos de android y la ID de recursos?
https://developer.android.com/studio/projects/android-library.html#PrivateResources
public.xml es útil para proyectos de biblioteca en general. Si incluye un public.xml, se supone que el resto de sus recursos son privados.
Aunque los recursos privados seguirán siendo utilizables por otros proyectos, el linter advertirá sobre su uso y no se incluirán en el autocompletado de AndroidStudio.
Aquí hay una esencia para autogenerar public.xml https://gist.github.com/HannahMitt/99922d4183bdb03356fd339413ba6303