2012-04-23 36 views
9

我正在为一个项目制作几个Android库应用程序。为了简化问题,假设我在这个项目中有两个库(utilLib,screenLib)(现在将被称为app)。Android如何处理多个R.java?

在每个项目中都有相同名称但具有不同值的字符串资源。就像这样:

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> 

应用

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

我意识到,我可以请参考使用com.package.R的字符串,但如果我的代码看起来像这样会显示什么?

<!-- 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') 
} 

我想在这里做模块化构建,但没有完全理解Android如何优先使用它的R.java。有没有人有过这方面的经验?

回答

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

原因来自官方开发指南Managing Projects - Library Projects报价:

当你构建依赖于库项目的应用程序,SDK工具编译库到一个临时JAR文件,并使用它在主项目,然后使用结果生成.apk。在应用程序和库中都定义资源ID的情况下,这些工具可确保在应用程序中声明的资源具有优先权,并且库项目中的资源不会编译到应用程序.apk中。这使您的应用程序能够灵活地使用或重新定义在任何库中定义的任何资源行为或值。


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

这是通过库项目的优先级确定。

从官方开发指南Managing Project -Library Projects报价:

  • 资源冲突

    由于工具合并库项目的资源与那些依赖应用程序项目,一个给定的资源ID可能在两个项目中定义。在这种情况下,这些工具会从应用程序或优先级最高的库中选择资源,并丢弃其他资源。在您开发应用程序时,请注意,公共资源ID很可能在多个项目中定义,并将合并,并且来自应用程序或最高优先级库的资源优先。

从官方开发指南From Eclipse with ADT - Referencing a library project报价:

如果要添加多个库的引用,请注意,您可以设置其相对优先级(与合并顺序)通过选择库,并使用向上和向下控制。这些工具将引用的库与您的应用程序合并,从最低优先级(列表底部)开始到最高(列表顶部)。如果多个库定义相同的资源ID,则工具将从库中选择具有更高优先级的资源。应用程序本身具有最高优先级,并且其资源始终优先于库中定义的相同资源ID。

从官方开发指南From the Command Line - Referencing a Library Project报价:

如果要添加多个库的引用,请注意,您可以设置其相对优先级(与合并顺序)通过手动编辑project.properties文件和适当调整每个引用的.n索引。例如,假设这些引用:

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

您可以重新排列引用给予最高优先library_projectC这样:

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

我找不到可以解释这个更多的单词明确比官方开发指南。

+1

我从来没有真正给管理项目一个很好的阅读。愚蠢的我,我今晚会这样做。非常感谢:D – RobGThai 2012-04-23 11:02:59

+1

我已经阅读了许多书籍/在线指南,涵盖了不同的出版物所使用的不同编程技术。 Android官方开发者指南IMO是最好的,简单的英文单词,充满了现场示例和代码片段。这是我通过Cocoa/ObjectiveC选择它的主要原因之一:) – yorkw 2012-04-23 11:15:25

-1

你将不得不进口com.screenLib.R和com.utilLib.R
在你的代码应该可能抛出一个错误“无法解析你好”

Lemmme知道这是否是正确!!!!

+0

即使没有我导入任何R.的项目,解决项目Eclipse显示为** com.app.R.hello **但显然,没有一个。 – RobGThai 2012-04-23 10:22:32