2011-11-24 13 views
5

El androide documentation me dice que puedo acceder a una cadena de otro paquete utilizando el "nombre del paquete", sea lo que sea:¿Cómo hacer referencia a una cadena de otro paquete en una biblioteca usando XML en Android?

@[<package_name>:]<resource_type>/<resource_name> 

Así que en mi manifiesto que quieren acceder a una cadena que he puesto en un proyecto de biblioteca independiente, en el com.globalmentor.android package --- ahí es donde mi clase R es, después de todo:

<activity 
     android:label="@com.globalmentor.android:string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

eso ni siquiera compilar. Pero esto lo hace:

<activity 
     android:label="@string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

¿Por qué? ¿Qué significa la documentación de Android que habla sobre el "package_name"? ¿Por qué el primer ejemplo no funciona y por qué funciona el segundo ejemplo? No quiero que todos mis nombres de recursos se combinen en el mismo archivo R --- Los quiero dividir en paquetes, como los escribí.

Respuesta

3

En resumen: el prefijo del nombre del paquete es para bibliotecas compartidas, no para su apk.

La documentación lee:

Para hacer referencia a un sistema de recursos , que tendría que incluir el nombre del paquete

Esto corresponde a las bibliotecas compartidas externos (y sus recursos), su solicitud está vinculado contra (por ejemplo, mapas). Tienen su propia clase R, no fusionada con la de su aplicación.

Estos son todos los paquetes android estándar y las bibliotecas compartidas que mencionaste en la sección de manifiesto de Android.

Como señaló Nikolay, todos los recursos de la aplicación se fusionaron, por eso la mayoría de los proyectos de la biblioteca usan prefijos como abs__ para sus nombres de recursos.

Consulte Library projects doc para obtener información adicional.

1

Tanto si te gusta como si no, los recursos del proyecto de la biblioteca se fusionan en los recursos del proyecto de la aplicación, los recursos con el mismo nombre del proyecto de la aplicación anulan los de los proyectos de la biblioteca. Mire el archivo R.java en el proyecto de la aplicación para confirmar.

Puede acceder a los recursos del marco de trabajo exportados públicamente usando @android:string/foo (paquete 'android'), pero no creo que pueda exportar recursos desde un proyecto de biblioteca como este (todavía).

+1

¿En serio? ¿De qué sirve tener 'com.myapp.R' y' com.library.R' si todos los nombres siguen en conflicto? Así que tengo que usar 'com.example.foo.R.id.com_example_foo_bar' en lugar de' com.example.foo.R.id.bar' sólo para mantener los nombres de choque cuando quedan fusionadas? Que tonto. –

+2

¿Todavía no tiene idea de lo que significa la documentación cuando dice "package_name" (vea la pregunta original)? –

2

¿Por qué?

Porque ha agregado ese proyecto de biblioteca a su proyecto, por lo que Android fusiona los recursos, por lo que el último proyecto que se genera "gana" el nombre. Por esta razón, es una buena idea prefijar los recursos. En este caso, el "nombre_del_paquete" no se puede usar ya que tiene esos recursos en su propio proyecto. Me imagino que este es tu caso porque compila sin el nombre del paquete.

Si no tiene ese proyecto de biblioteca agregado a su proyecto, entonces una posible solución es usar SharedUserId.

Fuente: http://developer.android.com/tools/projects/index.html

consideraciones de desarrollo

medida que desarrolla su proyecto de biblioteca y las aplicaciones dependientes, mantienen los siguientes puntos en mente:

  • Los conflictos de recursos ya que las herramientas se fusionan los recursos de un proyecto de biblioteca con los de un proyecto de aplicación dependiente, se podría definir un ID de recurso dado en ambos proyectos. En este caso, las herramientas seleccionar el recurso de la aplicación, o en la biblioteca con la más alta prioridad , y desechar el otro recurso. A medida que desarrolla sus aplicaciones, tenga en cuenta que los ID de los recursos comunes es probable que sean definido en más de un proyecto y se fusionarán, con el recurso de la biblioteca de aplicaciones o de mayor prioridad que tiene precedencia.
  • Use prefijos para evitar conflictos de recursos Para evitar conflictos de recursos para ID de recursos comunes, considere usar un prefijo u otro esquema de nomenclatura consistente que sea exclusivo del proyecto (o sea único en todos los proyectos ).
0

un nombre al recurso en su paquete como com.globalmentor.android.app_applicationlistactivity_lab y no sólo app_applicationlistactivity_lab.

<?xml version="1.0" encoding="utf-8"?> <resources> .... <string name="com.globalmentor.android.app_applicationlistactivity_lab">...</string>
.... </resources>

A continuación, puede acceder a él desde XML como

"@string/com.globalmentor.android.app_applicationlistactivity_lab"

y mediante programación

getResources().getString(R.string.com_globalmentor_android_app_applicationlistactivity_lab);

sin conflictos.

Cuestiones relacionadas