Colisión de claves de recursos de Android
Tengo dos proyectos Android, uno principal (nombre del paquete com.adip.sampler
) y una biblioteca que se agrega a main (nombre del paquete com.samples.projb
). En ambos de los recursos tengo un integer-array
con la misma clave: my_int_values
:
En proyecto principal:
- Problema en matriz de cadena en archivo xml: se esperan múltiples sustituciones especificadas en formato no posicional y etiqueta encontrada </ item> donde </ string-array> se espera
- ¿Dónde está la documentación del elemento `<attr>` de XML de recursos de Android?
- Android getResources (). GetDrawable () API obsoleto 22
- ¿Cómo puedo obtener el atributo fgcolor para trabajar en versiones recientes de Android?
- Herramienta de traducción para Android para ayudar a proporcionar el contexto
<integer-array name="my_int_values"> <item>10</item> <item>20</item> <item>30</item> <item>40</item> <item>50</item> <item>60</item> <item>70</item> <item>80</item> </integer-array>
Mientras que en la biblioteca:
<integer-array name="my_int_values"> <item>34</item> <item>35</item> <item>36</item> <item>37</item> </integer-array>
En el proyecto principal de una actividad si estoy investigando cuáles son los valores de estos arrays (tanto el proyecto principal como la biblioteca):
protected void showLocalStrings() { Log.d("RESSampler", "In Main: " + Arrays.toString(getResources().getIntArray(com.adip.sampler.R.array.my_int_values))); Log.d("RESSampler", "In Libr: " + Arrays.toString(getResources().getIntArray(com.samples.projb.R.array.my_int_values))); }
Entonces estoy viendo esto en Logcat:
In Main: [10, 20, 30, 40, 50, 60, 70, 80] In Libr: [10, 20, 30, 40, 50, 60, 70, 80]
Parece que el proyecto principal está anulando los valores definidos en la colección de la biblioteca … He duplicado comprobado si estoy leyendo de los recursos con la clave correcta y que está bien. Hasta que eché un vistazo en cada clase R
generada. En el proyecto principal esto es lo que tengo para com.adip.sampler.R.array.my_int_values
:
public static final class array { public static final int my_int_values=0x7f060000; }
Mientras que en el proyecto de la biblioteca com.samples.projb.R.array.my_int_values
:
public static final class array { public static final int my_int_values = 0x7f060000; }
La herramienta de Android ha generado el mismo valor, por lo que no es de extrañar que esté recibiendo este comportamiento. Puedo deshacerme de este comportamiento si cambio la clave de una de las matrices de números enteros, pero imagina que tienes algunos proyectos grandes con muchos recursos, bibliotecas de dependencia y tarde o temprano puedes chocar con este tipo de problemas: El mismo tipo de recursos con el mismo valor dominante (he comprobado con la string
y con la string-array
y el comportamiento antedicho aparece allí también). Así que las preguntas serían:
- ¿Por qué aparece este problema? O si no es un problema lo que explica este comportamiento?
- ¿Cómo evitarlo mejor? Supongo que tratar de tener algún tipo de singularidad en la definición de las claves hará el truco, pero los desarrolladores tienden a ser perezoso …
Esto aparece usando múltiples variantes de las últimas versiones ADT y Eclipse (Juno e Indigo). Verificado sólo en Windows.
- ¿Hay una necesidad de mantener ambos "layout" y "layout-sw400dp"?
- ¿Cómo se usa Resources.getFraction ()?
- ¿Cómo hago Eclipse / ADT honrar las etiquetas de nocompress que agregué a build.xml?
- Uso conveniente de Android XmlResourceParser?
- ¿Cómo se utiliza obtenerStyledAttributes (int ) con temas internos de Android
- Android: programaticamente setId es da una advertencia Esperado recurso de tipo id
- Android Build en Eclipse no genera los ids de recursos correctos en R.java
- GetContentView en Android
Lectura de proyectos de la biblioteca en desarrolladores de Android , hay muchas referencias donde claramente dicen que la fusión ocurre en el tiempo de construcción y los recursos con los mismos ID se sobreescriben entre sí.
Para recursos con el mismo ID de una biblioteca y una aplicación
En los casos en que se define un ID de recurso en la aplicación y en la biblioteca, las herramientas garantizan que el recurso declarado en la aplicación obtiene prioridad y que el recurso del proyecto de biblioteca no se compila en la aplicación .apk . Esto le da a su aplicación la flexibilidad de utilizar o redefinir cualquier comportamiento de recursos o valores que se definen en cualquier biblioteca.
Para recursos con la misma ID de dos bibliotecas
… su aplicación puede agregar referencias a varios proyectos de biblioteca y, a continuación, especificar la prioridad relativa de los recursos de cada biblioteca. Esto le permite crear los recursos realmente utilizados en su aplicación de forma acumulativa. Cuando dos bibliotecas referenciadas desde una aplicación definen el mismo ID de recurso, las herramientas seleccionan el recurso de la biblioteca con mayor prioridad y descartan la otra.
Solución sugerida en la documentación
Utilice prefijos para evitar conflictos de recursos
Para evitar conflictos de recursos para ID de recursos comunes, considere el uso de un prefijo u otro esquema de nomenclatura coherente que sea exclusivo del proyecto (o sea único en todos los proyectos).
Cómo establecer la prioridad en las bibliotecas desde la línea de comandos
Si está agregando referencias a varias bibliotecas, tenga en cuenta que puede establecer su prioridad relativa (y el orden de combinación) editando manualmente el archivo project.properties y ajustando el índice .n de cada referencia, según corresponda.
Personalmente, cambiaría los nombres de los recursos. Si lee algo acerca de las convenciones de nomenclatura, debe ser algo significativo y "my_int_array" no es realmente muy útil, especialmente en una biblioteca que otras personas o proyectos podrían utilizar potencialmente.
Idealmente, usted quiere ser capaz de olvidar esto por 6 meses, volver y mirar y saber lo que esa matriz es para / contiene, sin tener que ahondar a través de código para deducir lo que la matriz es por lo que se hace con él.
Esta publicación; https://stackoverflow.com/a/7249410/1222199 contiene algunas respuestas diferentes sobre las convenciones de nomenclatura.
Por último, no estoy seguro sobre el conflicto, no podía cavar nada. Supongo que tiene que ver con la forma en que se genera automáticamente, tal vez valga la pena registrarlo como un error y ver si obtiene alguna respuesta del equipo de desarrollo.
- ¿Cómo implementar widget de rueda como en el iPhone?
- Java HttpURLConnection VS Android HttpURLConnection