是否可以通过反射提供其名称来使用变量?

时间:2013-01-04 23:19:39

标签: java android

我正在尝试访问运行时在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.

我可以通过反思实现这一目标吗?

3 个答案:

答案 0 :(得分:3)

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

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

您可能想查找the documentation on getIdentifier()

答案 1 :(得分:2)

如果应用程序并不真正需要它,那么使用反射实际上并不是一个好主意。您可以通过using resource files在运行时获取不同的资源,具体取决于条件(屏幕大小,API版本,区域设置等),方法是使用适当的名称定义不同文件夹中的资源。

尽可能避免反射。您还要将getStringId()int赋予String变量。

String current = getStringId();

答案 2 :(得分:0)

是的,这是可能的。但是它使用反射是混乱的,复杂的,低效的并且可能很脆弱。

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

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

然后使用MAP.get(str)获取值。


注意 - 这是一般的Java解决方案。 @ Eric的答案提供了更好的Android特定解决方案。