如何将String转换为其资源ID(Android Studio)

时间:2016-01-22 22:42:01

标签: java android android-studio

我的values/strings.xml文件中有一个xml字符串

    <string name="pokemon_d">150</string>

我的控制器"150"中有字符串MainActivity.java。在我的MainActivity中,如何将String转换为xml文件中pokemon_d字符串的资源ID?这甚至可能吗?

3 个答案:

答案 0 :(得分:10)

您无法按值获取标识符,但您可以使您的标识符名称看起来像一个值并通过字符串名称获取,

所以我建议,

使用您的String资源名称,例如resource_150

<string name="resource_150">150</string>

现在这里resource_string.xml文件中的字符串条目很常见,所以 在你的代码中,

String value = "150";
int resourceId = this.getResources().
             getIdentifier("resource_"+value, "string", this.getPackageName());

现在resourceId值等同于R.string.resource_150

请确保此处this代表您的应用程序上下文。在您的情况下,MainActivity.this将有效。

答案 1 :(得分:0)

修改

您无法通过字符串值搜索资源ID。您可以创建自己的值和resourceId的Map,并将其用作查找表,但我相信只选择一个智能命名约定就像在接受的答案中一样是最好的解决方案。

答案 2 :(得分:0)

我在这里找到了一些提示:Android, getting resource ID from string?

下面是一个示例,了解如何在strings.xml中定义字符串及其值。你唯一要做的就是做一个循环并测试哪个字符串保存你的值。如果需要多次重复,那么构建数组可能会更好。 // ---------

    String strField = "";
    int resourceId = -1;
    String sClassName = getPackageName() + ".R$string";
    try {
        Class classToInvestigate = Class.forName(sClassName); 

        Field fields[] = classToInvestigate.getDeclaredFields();

        strField = fields[0].getName();     
        resourceId = getResourceId(strField,"string",getPackageName());

        String test = getResources().getString(resourceId);

        Toast.makeText(this,
                       "Field: " + strField + " value: " + test ,
                       Toast.LENGTH_SHORT).show();


    } catch (ClassNotFoundException e) {
            Toast.makeText(this,
                       "Class not found" ,
                       Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this,
                       "Error: " + e.getMessage() ,
                       Toast.LENGTH_SHORT).show();
    }


}
public int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}