如何在代码中引用Android库的strings.xml中的字符串?

Hon*_*ong 8 android android-resources

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

getString(R.string.foo)
Run Code Online (Sandbox Code Playgroud)

getString是Context的一种方法.

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

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

假设:库有一个字符串foo,其值为"library foo".一个app项目有一个字符串foo,其值为"app foo"

以下代码

Log.d("Debug", "App foo ID: " + R.string.foo);  
Log.d("Debug", "App: foo value: " + getString(R.string.foo));
Run Code Online (Sandbox Code Playgroud)

产生:

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
Run Code Online (Sandbox Code Playgroud)

在库方法中,以下代码

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

产生:

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
Run Code Online (Sandbox Code Playgroud)

以上显示ID冲突因此错误的字符串值.

mpo*_*lci 7

当您指示引用库中定义的字符串资源时,您可以使用getString()方法,您只需要一个Context,但在您的示例中,冲突是由字符串的相同名称生成的.

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

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

  • 你的图书馆里有mylib_foo
  • foo在你的申请中

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

在开发库模块和相关应用程序时,请记住下面列出的要点:

  • 资源冲突

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

  • 使用前缀来避免资源冲突

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


DDR*_*man 5

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

是否有特定的用例/代码示例可以说明此方法不起作用?

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

  • 该方法没有Context引用,如何使用getString()? (2认同)