Android getIdentifier对字符串不起作用?

时间:2011-07-12 09:52:06

标签: android

我真的不知道为什么,但我无法检索字符串的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");

所以我真的不明白这里发生了什么,有什么想法吗?

5 个答案:

答案 0 :(得分:15)

此代码看起来像是正确的代码:

int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");

它应该有效,但如果没有,我建议你不要试图解决这个问题,并试着理解它为什么不起作用:

1)首先尝试在项目/项目中找到下一个声明的字段:

About_EmailPrompt

如果您使用的是eclips,则应按 Ctrl + H 并打开 Java Search 标签 Java Search Dialog

如果您获得搜索结果,请转到步骤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());
    }

我认为你应该使用字符串而不是字符串