10

我正在为一个项目制作几个 Android 库应用程序。为了简化问题,假设我在这个项目中有两个库(utilLibscreenLib)(现在将被称为app)。

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

工具库

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

屏幕库

<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。有没有人经历过这个?

4

2 回答 2

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

来自官方开发指南管理项目 - 图书馆项目的原因引用:

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


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

这是由图书馆项目优先级决定的。

引用官方开发指南管理项目 - 库项目

  • 资源冲突

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

引用官方开发指南From Eclipse with ADT - 引用库项目

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

从命令行引用官方开发指南- 引用图书馆项目:

如果要添加对多个库的引用,请注意,您可以通过手动编辑 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

我找不到任何可以比官方开发指南更清楚地解释这一点的词。

于 2012-04-23T10:48:02.860 回答
-1

你将不得不
在你的代码中导入 com.screenLib.R 和 com.utilLib.R 它可能会抛出一个错误“无法解析你好”

让我知道这是否正确!!!!

于 2012-04-23T10:07:07.023 回答