2012-04-23 20 views
9

Estoy haciendo un par de aplicaciones de biblioteca de Android para un proyecto. Para simplificar la pregunta, digamos que tengo dos bibliotecas (utilLib, screenLib) en este proyecto (ahora se hará referencia como aplicación).¿Cómo manejan Android múltiples R.java?

Hay un recurso de cadena con el mismo nombre dentro de cada proyecto pero con valores diferentes. De esta manera:

utilLib

<string name="app_version">1.0</string> 
<string name="hello">UtilLib Hello</string> 

screenLib

<string name="app_version">0.7a</string> 
<string name="hello">ScreenLib Hello</string> 

aplicación

<string name="app_version">0.1</string> 

me di cuenta de lo que pueda consulte la cadena utilizando com.package.R, pero ¿qué ocurre si mi código se ve así?

<!-- language: java --> 
import com.app.R; 
... 

private void checkValue(){ 
    String version = getString(R.app_version); 
    Log.d(TAG, "version: " + version); // 0.1 show be here 
    String hello = getString(R.hello); 
    Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello') 
} 

que estoy tratando de hacer fabricación modular aquí, pero no entiendo completamente cómo Android priorizar su R.java de usar. Alguien ha tenido experiencia con esto?

Respuesta

12
Log.d(TAG, "version: " + version); // 0.1 show be here 

Razón citando de guía dev oficial Managing Projects - Library Projects:

Cuando se construye una aplicación que depende de un proyecto de biblioteca, las herramientas de SDK compilar la biblioteca en un archivo JAR temporal y lo utiliza en su mayor parte proyecto, luego usa el resultado para generar .apk. En los casos en que se define una ID de recurso tanto en la aplicación como en la biblioteca, las herramientas aseguran que el recurso declarado en la aplicación tenga prioridad y que el recurso en el proyecto de la biblioteca no se compile en la aplicación .apk. Esto le da a su aplicación la flexibilidad de usar o redefinir cualquier comportamiento de recursos o valores definidos en cualquier biblioteca.


Log.d(TAG, "Hello: " + hello); // <---- ? ('UtilLib Hello' or 'ScreenLib Hello') 

Esto se determina por prioridad proyecto de biblioteca.

Citando de guía dev oficial Managing Project -Library Projects:

  • de recursos en conflicto

    Dado que las herramientas se combinan los recursos de un proyecto de biblioteca con los de un proyecto depende de la aplicación, un recurso dado ID podría definirse en ambos proyectos. En este caso, las herramientas seleccionan el recurso de la aplicación, o la biblioteca con mayor prioridad, y descartan el otro recurso. A medida que desarrolla sus aplicaciones, tenga en cuenta que es probable que las ID de recursos comunes se definan en más de un proyecto y se fusionarán, teniendo prioridad el recurso de la aplicación o la biblioteca de mayor prioridad.

Citando de guía dev oficial From Eclipse with ADT - Referencing a library project:

Si va a añadir referencias a varias bibliotecas, tenga en cuenta que puede establecer su prioridad relativa (y fusionar orden) mediante la selección de una biblioteca y el uso los controles Arriba y Abajo. Las herramientas combinan las bibliotecas referenciadas con su aplicación comenzando desde la prioridad más baja (parte inferior de la lista) hasta la más alta (parte superior de la lista). Si más de una biblioteca define la misma ID de recurso, las herramientas seleccionan el recurso de la biblioteca con mayor prioridad. La aplicación en sí tiene la más alta prioridad y sus recursos siempre se usan con preferencia a los ID de recursos idénticos definidos en las bibliotecas.

Citando de guía dev oficial From the Command Line - Referencing a Library Project:

Si va a añadir referencias a varias bibliotecas, tenga en cuenta que puede establecer su prioridad relativa (y fusionar orden) modificando manualmente el archivo y project.properties ajustando el índice .n de cada referencia según corresponda. Por ejemplo, supongamos que estas referencias:

android.library.reference.1=path/to/library_projectA 
android.library.reference.2=path/to/library_projectB 
android.library.reference.3=path/to/library_projectC 

Puede reordenar las referencias para dar mayor prioridad a library_projectC de esta manera:

android.library.reference.2=path/to/library_projectA 
android.library.reference.3=path/to/library_projectB 
android.library.reference.1=path/to/library_projectC 

No puedo encontrar ninguna palabra que pueda explicar esto más claro que la guía oficial de desarrollo.

+1

Realmente nunca le doy buena lectura a los Proyectos Administrativos. Tonto, voy a hacer eso esta noche. Muchas gracias: D – RobGThai

+1

He leído muchos libros/guía en línea que cubre diferentes tecnologías de programación de diferentes publicaciones. La guía de desarrollo oficial de Android IMO es la mejor y más sencilla palabra en inglés con ejemplos en vivo y fragmentos de código. Esta es una de las razones principales por las que lo elijo sobre Cocoa/ObjectiveC :) – yorkw

-1

tendrá que importar com.screenLib.R y com.utilLib.R
En su código que probablemente debería generar un error "no se puede resolver hola"

Lemmme sabe si esto es correcto !!!!

+0

El proyecto se resolvió incluso sin que yo importara ninguno de los R. Eclipse lo muestra como ** com.app.R.hello ** pero claramente, no hay ninguno. – RobGThai

Cuestiones relacionadas