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

MyN*_*ero 28 resources android

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

我想显示字符串的"翻译版本".例如,在Activity中:

String name = "Water";
TextView nameDisplay = new TextView(this).
nameDisplay.setText(name);
Run Code Online (Sandbox Code Playgroud)

在字符串文件中我有定义

<string name="Water">French word for Water</string>
Run Code Online (Sandbox Code Playgroud)

如果我使用这样的东西:

nameDisplay.setText(R.string.KnownName);
Run Code Online (Sandbox Code Playgroud)

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

我目前的解决方法是

String translation = ""

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

nameDisplay.setText(translation);
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?

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

Kon*_*rov 50

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

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

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

请注意,从字符串到标识符的转换使用反射,因此可能不那么快,因此请谨慎使用.


ArK*_*ArK 5

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

  • 建议使用 context.getPackageName() 作为包参数 (2认同)