我使用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。这是最好的解决方案吗?
答案 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;清洁”