-1

我正在尝试访问在运行时在 R.java 类中生成的一些字符串资源。

R.java:

  public static final class string {
   public static final int app_name=0x7f040000;
    public static final int eightOvereight=0x7f040030;
    public static final int eightOvernine=0x7f040031;
    public static final int fiveOvereight=0x7f040027;
    public static final int fiveOverfive=0x7f040024;
    public static final int fiveOvernine=0x7f040028;
    public static final int fiveOverseven=0x7f040026;
    public static final int fiveOversix=0x7f040025;
    public static final int fourOvereight=0x7f040022;
    public static final int fourOverfive=0x7f04001f;
    {

在运行时我有:

     String current = getStringId(); // assume current = "eightOvereight" after this line

     //now I would like to use R.string.eightOvereight. I don't want to use a switch statement.

我可以通过反思来实现这一点吗?

4

3 回答 3

3

你可以使用反射,但是......不要使用反射。它应该只在非常非常罕见的情况下使用。这不是其中之一。

Android 提供了一种在运行时选择可变资源的机制。

String current = getStringId();

Resources res = context.getResources(); // Must provide an Activity or Context object here
int resourceId = res.getIdentifier(current, "string", context.getPackageName());
// Do whatever with resourceId

您可能需要在 上查找文档getIdentifier()

于 2013-01-04T23:34:09.320 回答
2

如果应用程序并不真正需要它,那么使用反射实际上并不是一个好主意。您可以在运行时根据条件(屏幕大小、API 版本、语言环境等)使用资源文件来获取不同的资源,方法是在具有适当名称的不同文件夹中定义资源。

如果可能,尽量避免反思。您还分配getStringId()了应该是int字符串变量的值。

String current = getStringId();
于 2013-01-04T23:26:19.193 回答
0

是的,有可能。但是为此使用反射是混乱、复杂、低效且可能脆弱的。

最好使用HashMap;进行查找。例如,假设您需要这些变量作为静态变量存在,然后添加:

  private static Map<String, Integer> MAP = new Map<String, Integer> {{
      put("eightOvereight", eightOvereight);
      put("eightOvernine", eightOvernine);
      ....
  }

然后使用MAP.get(str).


注意 - 这是一个通用的 Java 解决方案。@Eric 的回答提供了更好的 Android 专用解决方案。

于 2013-01-04T23:33:50.370 回答