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

时间:2010-11-24 03:37:57

标签: android android-layout eclipse-adt android-library

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

在我的图书馆,我有:

  1. 包含

    library_layout.xml

    < TextView的
        机器人:ID = “@ + ID / str_my_string”
        机器人:layout_width = “WRAP_CONTENT”
        机器人:layout_text = “WRAP_CONTENT”
        >

  2. 调用

    的java文件

    ((TextView的)this.findViewById(R.id.str_my_string))的setText(R.string.my_string);

  3. 包含

    的资源strings.xml

    < string name =“my_string”>占位符< / string>

  4. 在使用库的项目中我有

    1. 包含

      的资源strings.xml

      < string name =“my_string”>实际字符串内容< / string>

    2. 我期望的行为是,当我使用库运行项目时,文本视图显示实际字符串内容,但它实际上包含 false

      查看使用该库的应用程序,我看到两个R文件,并且它们都有R.string.my_string,并且这两个文件都等于相同的数字值。

2 个答案:

答案 0 :(得分:60)

我有相同的安排,这对我来说符合预期。

该库具有布局/类,其中包含对字符串资源的引用:

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

库在strings.xml中提供了一个默认值:

<string name="studentSinceLabel">Student Since</string>

主app在strings.xml中有这个值:

<string name="studentSinceLabel">Client Since</string>

当我在主应用程序strings.xml中为这个资源提供一个值时,我看到应用程序运行时的“Client Since”,当我从主应用程序strings.xml中删除它时,我看到了库中的值, “学生自”。

似乎这是基于我在这里阅读的预期行为: http://developer.android.com/tools/sdk/eclipse-adt.html

以上链接的相关引用:

  

在应用程序和库中都定义了资源ID的情况下,这些工具可确保应用程序中声明的资源获得优先级,并且库项目中的资源不会编译到应用程序.apk中。这使您的应用程序可以灵活地使用或重新定义任何库中定义的任何资源行为或值。

答案 1 :(得分:0)

只有这个错误,这是我的情况:

如果您将多个strings.xml文件用于库中的不同屏幕尺寸,则您的应用可能会使用该库文件。

IE(如果有):

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

和:

APP :
    res/values/strings.xml

您尝试以600dp屏幕大小(即平板电脑)启动应用,那么您的应用将从{strong>库中获取strings.xml(sw600dp)
为避免这种情况,您可能想在您的 app 中创建一个专门针对strings.xml分辨率的sw600dp,该字符串包含与库中相同的字符串值。