Android getIdentifier对字符串不起作用?

tch*_*upi 24 android

我真的不知道为什么,但我无法检索字符串的Id.

这是我的代码:

int resId = getApplicationContext().getResources()
           .getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
Run Code Online (Sandbox Code Playgroud)

但它适用于所有其他类的R文件:

int resId = getApplicationContext().getResources()
           .getIdentifier("arrow","drawable", "com.yoki.android.cat");
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*nov 16

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

int resId = getApplicationContext().getResources().getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat");
Run Code Online (Sandbox Code Playgroud)

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

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

About_EmailPrompt
Run Code Online (Sandbox Code Playgroud)

如果您使用的是eclips,则应按Ctrl + H并打开Java Search选项卡 Java搜索对话框

如果您获得搜索结果,请转到步骤2,否则请转到步骤3

2)您应该将结果作为层次结构

<YOUR_PACKAGE_NAME>
    -- R
     -- string
         -- About_EmailPrompt
Run Code Online (Sandbox Code Playgroud)

2.1)检查您在代码中写入正确的包名称

.getIdentifier("About_EmailPrompt", "string", <YOUR_PACKAGE_NAME>);
Run Code Online (Sandbox Code Playgroud)

2.2)检查你在文字字符串中只使用拉丁符号:

"About_EmailPrompt"
Run Code Online (Sandbox Code Playgroud)

"string"
Run Code Online (Sandbox Code Playgroud)

2.3)检查你在name属性中只使用拉丁符号strings.xml

<string name="About_EmailPrompt">SOME_VALUE</string>
Run Code Online (Sandbox Code Playgroud)

3)如果您没有搜索结果

3.1)检查你在文字字符串中只使用拉丁符号:

"About_EmailPrompt"
Run Code Online (Sandbox Code Playgroud)

3.2)检查你在name属性中只使用拉丁符号strings.xml

<string name="About_EmailPrompt">SOME_VALUE</string>
Run Code Online (Sandbox Code Playgroud)

3.3)对所有项目进行清理和构建

PS如果这对您没有帮助,请尝试重新启动IDE(有时eclipse会错误地生成R.java,直到重新启动)


sha*_*afi 8

作为替代方法,您可以使用反射:

R.string.class.getField("string_name").getInt(null);
Run Code Online (Sandbox Code Playgroud)

这主要通过按名称获取类的字段然后获取整数值来实现.

我们传递null作为对象,因为生成的所有资源字段都是静态的,因此不是对象的一部分.

你可能需要处理一些异常(NoSuchFieldException等),以防你输入错误,但它确实有效.


Apq*_*pqu 5

我已经设法在我的应用程序中获得了一个有效的解决方案。因此,根据原始问题,您需要将其更改如下:

int resId = getApplicationContext().getResources()
           .getIdentifier("com.yoki.android.cat:string/About_EmailPrompt", null, null);
Run Code Online (Sandbox Code Playgroud)

这是另一种编写 getIdentifier() 方法的方法,但它似乎是这样工作的。


Ped*_*nho -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());
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 不,“字符串”应该没问题。这对我有用:`int id = getResources().getIdentifier(key, "string", getPackageName());` (4认同)