繁体   English   中英

Android如何处理多个R.java?

[英]How Android handle multiple R.java?

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

每个项目中都有相同名称的String资源,但值不同。 像这样:

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

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并将其合并,其中来自应用程序或最高优先级库的资源优先。

从官方开发指南引用来自Eclipse with ADT - 引用库项目

如果要添加对多个库的引用,请注意您可以通过选择库并使用向上和向下控件来设置其相对优先级(和合并顺序)。 这些工具将引用的库与您的应用程序合并,从最低优先级(列表底部)到最高(列表顶部)。 如果多个库定义了相同的资源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 

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

您必须导入com.screenLib.R和com.utilLib.R
在你的代码中它应该抛出错误“无法解决问候”

Lemmme知道这是对的!!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM