我正在尝试访问运行时在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.
我可以通过反思实现这一目标吗?
答案 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
答案 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特定解决方案。