【问题标题】:Replace (or "Override") String in Android Library Project在 Android 库项目中替换(或“覆盖”)字符串
【发布时间】:2010-11-24 03:37:57
【问题描述】:

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

在我的图书馆里,我有:

  1. 一个library_layout.xml包含

    <TextView  
        android:id="@+id/str_my_string"  
        android:layout_width="wrap_content"  
        android: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">Placeholder</string>
    

在使用我拥有的库的项目中

  1. 一个资源strings.xml包含

    <string name="my_string">Actual string content</string>
    

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

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

【问题讨论】:

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


    【解决方案1】:

    我有同样的安排,这对我很有效。

    该库具有对字符串资源的此引用的布局/类:

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

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

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

    主应用在它的strings.xml中有这个值:

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

    当我在主应用程序 strings.xml 中为该资源指定值时,我在应用程序运行时看到“客户端以来”,当我从主应用程序 strings.xml 中删除它时,我看到库中的值, “学生以来”。

    根据我在此处的阅读,这似乎是预期的行为: http://developer.android.com/tools/sdk/eclipse-adt.html

    以上链接的相关引用:

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

    【讨论】:

    • 看来我只是遇到了 Eclipse 没有清理旧垃圾的问题。
    • 这很准确,但如果字符串在库中被翻译,它将失败。 lib 中的翻译版本会覆盖 using-app 版本(已翻译或未翻译)。所以吸取了教训:不要翻译占位符字符串。
    • @johand。对于使用翻译字符串资源的库,有什么方法可以在我们的项目中覆盖它?
    • 实际上我已经找到了翻译文本的解决方案,只需覆盖每个翻译版本即可。对于我的情况,我在 values/strings.xml 和 values-en/strings.xml 中有相同的资源 id 用于英语以显示我的覆盖文本,干杯。
    • 在我的情况下,覆盖默认资源不起作用。我的项目结构更复杂,有多个模块 - 我有一个使用模块 A 的应用程序,它依赖于第三方模块 B。在模块 A 中,我想覆盖模块 B 中的任何同名资源。例如,我有定义了我的颜色“蓝色”,但是我在运行时看到的是模块 B(第 3 方)中定义的蓝色阴影。没有翻译。对这样的设置有任何想法吗?
    【解决方案2】:

    刚刚出现这个错误,这就是我的情况:

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

    IE,如果你有:

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

    和:

    APP :
        res/values/strings.xml
    

    如果您尝试在 600dp 屏幕尺寸(即平板电脑)上启动您的应用,您的应用将从您的获取strings.xml(sw600dp)
    为避免这种情况,您可能希望在您的应用中创建一个特定于sw600dp 分辨率的strings.xml,其中包含与您的库中相同的字符串值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2012-04-14
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多