我有一个问题。 Android应用程序的资源:
我的申请有误解。模式(编辑/计划/执行),我想用枚举类型来描述。但是,我希望使用源自资源string.xml文件的字符串填充枚举值,即代替
enum Mode {
EDIT ("edit"),
PLAN ("plan"),
EXEC ("exec");
String name;
Mode(String name) { this.name = name; }
@Override
public String toString() { return this.name; }
};
我想写一些像:
enum Mode {
EDIT (getResources().getText(R.string.mode_edit).toString()),
PLAN (getResources().getText(R.string.mode_plan).toString())),
EXEC (getResources().getText(R.string.mode_exec).toString()));
String name;
Mode(String name) { this.name = name; }
@Override
public String toString() { return this.name; }
}
例如允许使用资源文件修改模式的名称,从而允许以后的名称修改,无需更改代码,国际化等。
问题是,对资源的标准访问是通过Activity的getResources()方法实现的,该方法仅在构造函数中可用(并且在实例方法中)。但是,枚举声明是类的静态初始化代码的一部分。有没有办法以静态方式访问应用程序的资源?
迈克尔
答案 0 :(得分:13)
enum Mode {
EDIT (R.string.mode_edit),
PLAN (R.string.mode_plan),
EXEC (R.string.mode_exec);
String id;
Mode(String id) { this.id = id; }
public String getName(Resources r){ return r.getText(id); }
@Override
public String toString() { return this.name; }
}
或者您可以执行以下操作:
public class ClassName {
public static Resources res;
}
在Application.onCreate()
或Activity.onCreate()
:
ClassName.res = getResources();
和您的enum Mode
:
@Override
public String toString() {
Resources res = ClassName.res;
if (res==null){ return super.toString(); }
else { return res.getText(id); }
}
答案 1 :(得分:0)
谢谢,radek-k,举例! 与此同时,我提出了一个类似的想法,即我在枚举中添加了一个静态方法,然后在Activity的onCreate()方法中传递资源句柄。这允许toString() - 方法然后访问资源字符串。恕我直言不是很优雅,但它有效...
干杯, 迈克尔
答案 2 :(得分:0)
基于此https://stackoverflow.com/a/3560656/262462并且因为R.string包含整数
enum Mode {
EDIT (R.string.mode_edit),
PLAN (R.string.mode_plan),
EXEC (R.string.mode_exec);
int id;
Mode(int id) { this.id = id; }
public String toString(Resources r) { return r.getString(id); }
}