在Android库项目中替换(或“覆盖”)字符串

36

我一直在尝试创建一个 Android 库项目,虽然构建过程正常,但在替换使用该库的项目中的资源时遇到了一些问题。

我的库中有:

  1. 一个包含 library_layout.xml 的文件,其中包含

    <TextView  
        android:id="@+id/str_my_string"  
        android:layout_width="wrap_content"  
        android:layout_text="wrap_content">
    
    一个调用的 Java 文件。
    ((TextView)this.findViewById(R.id.str_my_string)).setText(R.string.my_string);
    
    一个包含资源的strings.xml文件。
    <string name="my_string">Placeholder</string>
    
    在使用该库的项目中,
    1.

    有一个名为strings.xml的资源文件,其中包含

    <string name="my_string">Actual string content</string>
    
    我期望的行为是,当我使用该库运行项目时,文本视图将显示“实际字符串内容”,但它实际上包含“false”。 查看使用库的应用程序,我确实看到了两个R文件,它们都有 R.string.my_string,这两个值相等。
2个回答

75

我有相同的设置,这对我起到了预期的作用。

该库具有布局/类,其中引用了一个字符串资源:

<TextView android:id="@+id/studentSinceLabel">

该库在其strings.xml文件中提供了默认值:
<string name="studentSinceLabel">Student Since</string>

主应用程序在其strings.xml文件中有此值:
<string name="studentSinceLabel">Client Since</string>

当我在主应用程序的strings.xml中为此资源提供一个值时,当应用程序运行时,我会看到“Client Since”,当我从主应用程序的strings.xml中删除它时,我会看到库中的值,“Student Since”。根据我在此处阅读的内容,似乎这是预期的行为:http://developer.android.com/tools/sdk/eclipse-adt.html。上述链接中的相关引用如下:
在应用程序和库中都定义了资源ID的情况下,工具确保在应用程序中声明的资源具有优先级,并且库项目中的资源不会被编译到应用程序.apk中。这使您的应用程序具有灵活性,以使用或重新定义在任何库中定义的任何资源行为或值。

看起来我只是在使用Eclipse时遇到了清理旧文件的问题。 - jwriteclub
11
如果在库中翻译字符串,那么这是准确的,但会失败。库中的已翻译版本将覆盖使用应用程序版本(无论是否翻译)。所以教训是:不要翻译占位符字符串。 - johan d
1
@johand. 对于使用翻译字符串资源的库,有没有办法在我们的项目中覆盖它? - Bruce
2
实际上,我已经找到了翻译文本的解决方案,只需要同样覆盖每个翻译版本即可。对于我的情况,我在values/strings.xml和values-en/strings.xml中使用相同的资源ID来显示我覆盖的文本,干杯。 - Bruce
在我的情况下,覆盖默认资源不起作用。我的项目结构更加复杂,有多个模块 - 我有一个使用模块A的应用程序,该应用程序依赖第三方模块B。在模块A中,我想要覆盖任何与模块B相同名称的资源。例如,我定义了我的颜色“蓝色”,但是在运行时看到的是来自模块B(第三方)中定义的蓝色阴影。有关此类设置的任何想法? - Stan

2

我刚遇到了这个错误,以下是我的情况:

如果您在库中使用多个strings.xml文件来适应不同的屏幕尺寸,您的应用程序可能会使用该库文件。

例如,如果您有:

LIBRARY :  
    res/values/strings.xml  
    res/values-sw600dp/strings.xml

并且:

APP :
    res/values/strings.xml

当你在600dp的屏幕(例如平板电脑)上尝试启动应用程序时,应用程序将从你的库中获取strings.xml(sw600dp)文件。
为了避免这种情况,你可能希望在你的应用程序中创建一个针对sw600dp分辨率的strings.xml文件,其中包含与库中相同的字符串值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接