当name是数字时,Resources.getIdentifier()具有意外行为

时间:2011-06-17 14:32:29

标签: android string parsing resources localization

我使用Resources.getIdentifier动态加载字符串资源;因为我动态传递了一个需要从我的资源文件中翻译的字符串。当资源不存在时返回0;所以我处理了但是,当我传入一个数字字符串时;即使我没有在我的资源中定义,它返回我传入的数字而不是0.当我尝试获取该资源时,这会导致崩溃。

int identifier = context.getResources().getIdentifier(myText, "string", "com.farragut.android.emsspeak");
if (identifier > 0) {
    text2.setVisibility(View.VISIBLE);
    text2.setText(context.getResources().getString(identifier));
} else {
    text2.setVisibility(View.GONE);
}

这是定义的行为吗?我无法想象为什么当myText是“BLAH”时它能正常工作,但是当myText为“12”时它就不同了。我唯一能想到的是测试myText是否是数字的;虽然我能找到的唯一方法是尝试将其解析为整数并捕获numberFormatException。这是最好的解决方案吗?

3 个答案:

答案 0 :(得分:7)

这有点奇怪,但如果我指定完全限定的名称,就像它在getIdentifier()文档中提到的那样它可以正常工作,否则我会得到与你相同的结果。

使用getIdentifier("com.farragut.android.emsspeak:string/"+myText, null, null);

尝试

答案 1 :(得分:0)

字符串资源只能包含字符串,不能包含特殊字符,不能包含字母作为标记名称。

示例

<string name="mydata">Suuuuu</string>有效

<string name="45645">Suuuuu</string>无效

首先检查您的文字是否有效

使用以下代码使其适用于您

<强>代码

boolean isValid = (Pattern.matches("[a-zA-Z]+", myText))

if(isValid){
int identifier = context.getResources().getIdentifier(myText, "string", "com.farragut.android.emsspeak");
if (identifier > 0) {
    text2.setVisibility(View.VISIBLE);
    text2.setText(context.getResources().getString(identifier));
} else {
    text2.setVisibility(View.GONE);
}

}

由于 迪帕克

答案 2 :(得分:0)

我正在敲打我的头来做这项工作:

int imgId = getResources().getIdentifier("moviedetails" + movieId , "drawable", getPackageName());
imageview.setImageResource(imgId);

对我来说非常好。只需要:“项目 - &gt;清洁”