我真的不知道为什么,但我无法检索字符串的ID。
这是我的代码:
int resId = getApplicationContext().getResources()
.getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
但它适用于所有其他类的R文件:
int resId = getApplicationContext().getResources()
.getIdentifier("arrow","drawable", "com.yoki.android.cat");
所以我真的不明白这里发生了什么,有什么想法吗?
答案 0 :(得分:15)
此代码看起来像是正确的代码:
int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
它应该有效,但如果没有,我建议你不要试图解决这个问题,并试着理解它为什么不起作用:
1)首先尝试在项目/项目中找到下一个声明的字段:
About_EmailPrompt
如果您使用的是eclips,则应按 Ctrl + H 并打开 Java Search 标签
如果您获得搜索结果,请转到步骤2,否则请转到步骤3
2)您应该将结果作为层次结构
<YOUR_PACKAGE_NAME> -- R -- string -- About_EmailPrompt
2.1)检查你在代码中写了正确的包名
.getIdentifier("About_EmailPrompt", "string", <YOUR_PACKAGE_NAME>);
2.2)检查你在文字字符串中只使用拉丁符号:
"About_EmailPrompt"
和
"string"
2.3)检查您是否只使用name
strings.xml
属性中的拉丁符号
<string name="About_EmailPrompt">SOME_VALUE</string>
3)如果您没有搜索结果
3.1)检查你在文字字符串中只使用拉丁符号:
"About_EmailPrompt"
3.2)检查您是否只使用name
strings.xml
属性中的拉丁符号
<string name="About_EmailPrompt">SOME_VALUE</string>
3.3)清理并构建您拥有的所有项目
P.S。如果这对您没有帮助,请尝试重新启动IDE(有时eclipse会错误地生成R.java直到重新启动)
答案 1 :(得分:7)
作为替代方法,您可以使用反射:
R.string.class.getField("string_name").getInt(null);
通过按名称获取类的字段然后获取整数值,本质上可以解决这个问题。
我们传递null作为对象,因为生成的所有资源字段都是静态的,因此不属于对象。
你可能需要处理一些异常(NoSuchFieldException等),以防你输入错字,但确实有效。
答案 2 :(得分:4)
我已经设法在我的应用中获得了有效的解决方案。因此,根据原始问题,您需要将其更改为:
int resId = getApplicationContext().getResources()
.getIdentifier("com.yoki.android.cat:string/About_EmailPrompt", null, null);
这是编写getIdentifier()方法的另一种方法,但它似乎以这种方式工作。
答案 3 :(得分:0)
您可以创建一个方法来替换所有getIdentifier
- 调用。否则你必须混合两种不同的方法,这使得代码有点不清楚。
这种方法类似于@shalafi的解决方案并使用反射。
public static int getResId(String variableName, Class<?> c) {
try {
Field idField = c.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
并像这样使用它:
getResId("About_EmailPrompt", R.string.class); //or for other things
getResId("icon", R.drawable.class);
<小时/> 如果您使用
public static int getResStringId(String variableName) {
try {
Field idField = R.string.getDeclaredField(variableName);
return idField.getInt(idField);
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
甚至比getIdentifier()
或上述解决方案更快。 Source
答案 4 :(得分:-3)
我有这个功能:
public static int getDrawable(Context context, String name)
{
Assert.assertNotNull(context);
Assert.assertNotNull(name);
return context.getResources().getIdentifier(name,
"drawable", context.getPackageName());
}
public static int getString(Context context, String name)
{
Assert.assertNotNull(context);
Assert.assertNotNull(name);
return context.getResources().getIdentifier(name,
"strings", context.getPackageName());
}
我认为你应该使用字符串而不是字符串