13

要在应用程序项目的 strings.xml(在 res\values 中)引用字符串 foo,可以简单地使用

getString(R.string.foo)

getString 是 Context 的一个方法。

假设一个 Android 库的 strings.xml 中有一个字符串 foo。如何在库的方法中使用它?

已编辑:建议将 Context 的引用传递给库方法,以便可以使用 getString()。由于它是应用程序项目的上下文,因此存在潜在的冲突,可以说明如下:

假设:该库有一个字符串 foo,其值为“library foo”。一个应用项目有一个字符串 foo,其值为“app foo”

以下代码

Log.d("Debug", "App foo ID: " + R.string.foo);  
Log.d("Debug", "App: foo value: " + getString(R.string.foo));

生成:

03-22 05:53:55.590: D/Debug(16719): App foo ID: 2131230723
03-22 05:53:55.590: D/Debug(16719): App foo value: app foo

在库方法中,以下代码

Log.d("Debug", "Library foo ID: " + R.string.foo); 
Log.d("Debug", "Library foo value: " + context.getString(com.my.library.R.string.foo));

生成:

03-22 05:55:03.680: D/Debug(16719): Library foo ID: 2131230723
03-22 05:55:03.680: D/Debug(16719): Library foo value: app foo

上面显示了 ID 冲突因此错误的字符串值。

4

3 回答 3

8

正如您指出要引用库中定义的字符串资源,您可以使用 getString() 方法,您只需要一个上下文,但在您的示例中,冲突是由字符串的相同名称生成的。

当您在库中定义资源时,如果您在应用程序模块中使用相同的资源名称,则会发生冲突。为避免冲突,您必须使用唯一名称,例如在库中为资源名称使用公共前缀,不同的包名称是不够的。

要解决此问题,您可以使用以下名称:

  • mylib_foo在您的库中
  • foo在您的应用程序中

来自android文档的来源:http: //developer.android.com/tools/projects/index.html#considerations

在开发库模块和相关应用程序时,请牢记以下几点:

  • 资源冲突

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

  • 使用前缀避免资源冲突

    为避免公共资源 ID 的资源冲突,请考虑使用对模块唯一(或在所有项目模块中唯一)的前缀或其他一致的命名方案。

于 2015-03-13T22:08:29.023 回答
5

图书馆项目应该能够以完全相同的方式引用它的资源。

是否有特定的用例/代码示例说明这不起作用?

父项目中定义的任何字符串都将覆盖库。甚至 actionbarsherlock 也使用前缀 ex。abs__action_bar_home_description

于 2013-03-21T21:00:39.363 回答
2
//For boolean values
    int resId = context.getResources().getIdentifier("bool_ID", "bool", context.getPackageName());
    if(resId != 0){
       System.out.println(context.getResources().getBoolean(resId));
    }

    //For String values
    int resStringId = context.getResources().getIdentifier("string_ID", "string", context.getPackageName());
    if(resStringId != 0){
        System.out.println(context.getResources().getString(resStringId));
    }
于 2020-06-24T04:57:58.020 回答