Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android getIdentifier不';你不为字符串工作吗?_Android - Fatal编程技术网

Android getIdentifier不';你不为字符串工作吗?

Android getIdentifier不';你不为字符串工作吗?,android,Android,我真的不知道为什么,但我无法检索字符串的Id 这是我的代码: int resId = getApplicationContext().getResources() .getIdentifier("About_EmailPrompt", "string", "com.yoki.android.cat"); 但它适用于所有其他类型的R文件: int resId = getApplicationContext().getResources() .getId

我真的不知道为什么,但我无法检索字符串的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");
所以我真的不明白这里发生了什么,有什么想法吗?

我有以下功能:

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>