Android getIdentifier不';你不为字符串工作吗?
我真的不知道为什么,但我无法检索字符串的Id 这是我的代码:Android getIdentifier不';你不为字符串工作吗?,android,Android,我真的不知道为什么,但我无法检索字符串的Id 这是我的代码: int resId = getApplicationContext().getResources() .getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat"); 但它适用于所有其他类型的R文件: int resId = getApplicationContext().getResources() .getId
int resId = getApplicationContext().getResources()
.getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
但它适用于所有其他类型的R文件:
int resId = getApplicationContext().getResources()
.getIdentifier("arrow","drawable", "com.yoki.android.cat");
所以我真的不明白这里发生了什么,有什么想法吗?我有以下功能:
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());
}
我认为你应该使用字符串而不是字符串。我已经在我的应用程序中找到了一个有效的解决方案。因此,根据原始问题,您需要将其更改为以下内容:
int resId = getApplicationContext().getResources()
.getIdentifier("com.yoki.android.cat:string/About_EmailPrompt", null, null);
这是编写getIdentifier()方法的另一种方法,但它似乎是这样工作的。作为替代方法,您可以使用反射:
R.string.class.getField("string_name").getInt(null);
这实际上是通过按名称获取类的字段,然后获取整数值来实现的
我们将null作为对象传递,因为生成的所有资源字段都是静态的,因此不是对象的一部分
如果输入错误,您可能需要处理一些异常(NoSuchFieldException等),但它确实有效。您可以创建一个方法来替换所有的
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;
}
}
如果你使用
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()
或上述解决方案更快 此代码看起来像是正确的代码:
int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
它应该会起作用,但如果不行,我建议你不要试图回避这个问题,试着理解为什么它不起作用:
1) 首先,尝试在项目中查找下一个声明字段:
About_EmailPrompt
如果您使用的是eclips,则应按Ctrl+H并打开Java搜索选项卡
如果获得搜索结果,请转至步骤2,否则请转至步骤3
2) 您应该以层次结构的形式获得结果
及
2.3)检查是否仅在strings.xml的name
属性中使用拉丁符号
<string name="About_EmailPrompt">SOME_VALUE</string>
<string name="About_EmailPrompt">SOME_VALUE</string>
3.2)检查是否仅在strings.xml的name
属性中使用拉丁符号
<string name="About_EmailPrompt">SOME_VALUE</string>
<string name="About_EmailPrompt">SOME_VALUE</string>
SOME\u值
3.3)为所有项目进行清洁和建造
注意:如果这对您没有帮助,请尝试重新启动您的IDE(有时eclipse会在重新启动之前错误地生成R.java)您是否尝试在项目上执行“clean”?可能是一些旧缓存把事情搞砸了……您是否检查了生成的文件中是否定义了R.java
关于\u EmailPrompt
?否,“字符串”应该可以。这就是我的工作原理:intid=getResources().getIdentifier(键,“string”,getPackageName())代码>请注意,标识符应该与我们引用它的方式相同。如果它是R.string.some_string
,那么第二个参数应该是“string”
,而不是“strings”
。它实际上必须是“string”而不是“strings”。感谢上帝,我终于找到了一个能够做到这一点的人。我现在可以哭了。THANKSIt仍然显示像#ff026cec
这样的值,而不是真正的字符串。是的,它是一个int,它是资源的id,因此是请求的内容。您需要使用getString获取值。不管使用哪种语言,id都是相同的,字符串不是。这看起来像是一个优雅的解决方案,我希望它可以使用3个参数。资源名称、资源类型和资源包。最后两个参数是可选的。如果未提供最后两个参数,则第一个参数必须包含完整的资源路径。这意味着以下两个是相同的:int resId=getApplicationContext().getResources().getIdentifier(“com.yoki.android.cat:string/About_EmailPrompt”,null,null)代码>与以下代码相同:int resId=getApplicationContext().getResources().getIdentifier(“About_EmailPrompt”、“string”、“com.yoki.android.cat”)代码>
"string"
<string name="About_EmailPrompt">SOME_VALUE</string>
"About_EmailPrompt"
<string name="About_EmailPrompt">SOME_VALUE</string>