使用变量访问R.string的内容以表示资源名称

时间:2010-08-21 19:44:47

标签: android resources

我有一些字符串需要翻译和显示。这些字符串是变量。我在strings.xml文件中有翻译。

我想显示字符串的“翻译版本”。例如,在Activity中:

String name = "Water";
TextView nameDisplay = new TextView(this).
nameDisplay.setText(name);

在字符串文件中,我有定义

<string name="Water">French word for Water</string>

如果我使用过这样的东西:

nameDisplay.setText(R.string.KnownName);

它会起作用。但在我的情况下,名称存储在一个变量中,所以我不知道该怎么做才能让setText方法正常运行。

我目前的解决方法是

String translation = ""

if(name == "Water") {
  translation = getString(R.string.Water);
}
else {
  ...
}

nameDisplay.setText(translation);

......但这不能很好地扩展。

有什么建议吗?

我应该将翻译后的版本存储在变量中吗?

4 个答案:

答案 0 :(得分:49)

您可以使用该方法将字符串转换为int identifier:

public static int getStringIdentifier(Context context, String name) {
    return context.getResources().getIdentifier(name, "string", context.getPackageName());
}

将活动作为上下文参数(或任何其他Context实例)传递。然后您可以像往常一样使用getString()方法使用标识符。

请注意,从字符串到标识符的转换使用反射,因此可能不那么快,所以请小心使用。

答案 1 :(得分:5)

 private String getStringResourceByName(String aString)
    {
      String packageName = context.getPackageName(); 
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }

答案 2 :(得分:2)

您可以做的另一件事是将字符串映射到资源。这样你就可以在变量中包含字符串(或以编程方式构建它),然后使用map来查找资源id。

示例

的strings.xml

<string name="water_english">water</string>
<string name="water_spanish">agua</string>
<string name="water_chinese">水</string>
<string name="water_mongolian">ᠤᠰᠥ</string>

代码

public class MainActivity extends AppCompatActivity {

    private Map<String, Integer> stringForResourceIdMap = createMap();

    private Map<String, Integer> createMap() {
        Map<String, Integer> result = new HashMap<>();

        result.put("water_english", R.string.water_english);
        result.put("water_spanish", R.string.water_spanish);
        result.put("water_chinese", R.string.water_chinese);
        result.put("water_mongolian", R.string.water_mongolian);

        return result;
    }

    private String getMyStringResource(String lookupString) {
        int resourceId = stringForResourceIdMap.get(lookupString); // R.string.xxx
        return getString(resourceId);
    }

    // ...
}

注意

如果您localizing your app有不同的翻译,那么您应该使用不同的资源文件夹。

答案 3 :(得分:1)

作为Kotlin的扩展,可以用以下方式来编写ArK的答案。当您给它提供未知密钥时,它还会捕获异常。

fun Context.getStringWithResKey(nameResKey: String): String {
    val resId = resources.getIdentifier(nameResKey, "string", packageName)
    return try {
        getString(resId)
    } catch (e: Exception) {
        Log.e(this.javaClass.simpleName, "Couldn't find string value for key '$nameResKey'", e)
        ""
    }
}