静态访问Android应用的资源?

时间:2010-08-24 19:55:50

标签: android android-widget

我有一个问题。 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()方法实现的,该方法仅在构造函数中可用(并且在实例方法中)。但是,枚举声明是类的静态初始化代码的一部分。有没有办法以静态方式访问应用程序的资源?

迈克尔

3 个答案:

答案 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); }
}