从值中获取资源ID

11
我有很多语言特定的资源。在我的Android应用程序中,有一个地方需要获取资源值并将其翻译为相应的ID。该值不一定在当前语言(en/de/...)的语言特定文件中。它可能在其中的某个地方……而且它是唯一的。
阅读文档和此线程 "如何通过已知的资源名称获取资源ID?" 后,我认为 getIdentifier(String name, String defType, String defPackage) 是正确的方法,但我无法让它工作。结果总是“0”。
这段代码是活动的一部分,我使用的是Android 2.2。
Android是否可能不考虑所有资源文件,只搜索当前语言特定的文件?
例如(当前语言为“de”):
File: values-en/strings.xml
<resources>
   <string name="txt_afirsttext">A first text</string>
   <string name="txt_asecondtext">A second text</string>
</resources>

File: values-de/strings.xml
<resources>
   <string name="txt_afirsttext">Ein erster Text</string>
   <string name="txt_asecondtext">Ein zweiter Text</string>
</resources>

// Now I want to find the ID to this "en" text ...
String testValue = "A second text";
int i = this.getResources().getIdentifier(testValue, "strings", this.getPackageName());

// ... and translate it to the actual "de" language
String translatedValue = this.getResources().getString(i);

为了明确事情,我不想将字符串资源误用为数据库。这只是在非常罕见的情况下出现的一部分。

2个回答

29

你使用 getIdentifier 的方法是错误的。你需要指定文本的标识符而非文本本身,对于你的情况来说应该是 txt_afirsttext 或者 txt_asecondtext

int i = this.getResources().
             getIdentifier("txt_asecondtext", "string", this.getPackageName());

我认为没有办法通过其内容来定位字符串资源标识符。这就像传递字节流以定位可绘制对象一样。

你的应用程序真的需要这种奇怪的获取资源的方式吗?我相信你可以使用更好的方法来动态加载资源,尽管你的第一段描述了一个神秘的场景 :)

编辑:答案已经修复。感谢tdroza的纠正。


谢谢你的回答。看起来我需要为所有语言特定的字符串添加一个额外的表格。 - Harald Wilhelm
抱歉,我按下了<Enter>键太快了。问题在于,在某个特定的部分,我会得到外部数据。这些传输的数据没有键,只是10多种语言中的一个值。我甚至不知道这种语言。我只是得到了这个值。我有一个可能值和附加键的列表。由于这些值也需要用于UI,它们是各种“values-xx”目录的一部分。我的想法是保存第二个数据存储器,用于数千个文本对的查找资源值。好吧,这是个坏主意。我会去做另一个表。感谢您的帮助。 - Harald Wilhelm
你有没有找到比使用表格更合适的解决方案?(最好彻底替换内置的Android字符串本地化) - Rafael Nobre

11

对上面代码示例进行一处次要但很重要的更正:资源类型必须是单数形式而非复数形式。例如,使用"string"代替"strings",对于drawable、id、array等也同样适用。

例如:

int i = this.getResources().getIdentifier(testValue, "string", this.getPackageName());

1
资源类型应该是单数的说法并不适用于所有情况。当你在搜索复数资源时,请确保使用“plurals”作为资源类型。这让我花费了相当多的时间才发现 ;) - Peter

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