Static access to an Android app's resources?

六月ゝ 毕业季﹏ 提交于 2019-12-04 12:14:31

问题


I have a problem re. an Android application's resources:

My application has misc. modes (edit/plan/exec), which I would like to describe using an enumeration type. I would, however, like to populate the enumeration-values with strings that stem from the resource string.xml file, i.e. instead of

enum Mode {
    EDIT ("edit"), 
    PLAN ("plan"), 
    EXEC ("exec");

    String name;
    Mode(String name) { this.name = name; }
    @Override
        public String toString() { return this.name; }
};

I would like to write something like:

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; }
}

which would e.g. allow to modify the modes' names using the resource file and thus allow for later name modifications without code changes, internationalization, etc.

The problem is, that the standard access to the resources is via an Activity's getResources()-method which is only available in the constructor (and during instance methods). The enumeration declaration, however, is part of a class' static initialization code. Is there any way to access an app's resources in a static way?

Michael


回答1:


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; }
}

Alternatively you can do following:

public class ClassName {
    public static Resources res;
}

In your Application.onCreate() or Activity.onCreate():

ClassName.res = getResources();

and in your enum Mode:

    @Override
    public String toString() { 
        Resources res = ClassName.res;
        if (res==null){ return super.toString(); }
        else { return res.getText(id); }
    }



回答2:


Thanks, radek-k, for the examples! In the meantime I came up myself with a somewhat similar idea, namely I added a static method to the enum to which I then pass the resource-handle during the Activity's onCreate()-method. That allows the toString()-method then to access the resource strings. IMHO not very elegant, but it works...

Cheers, Michael




回答3:


Based on this https://stackoverflow.com/a/3560656/262462 and because R.string contains integers

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


来源:https://stackoverflow.com/questions/3560511/static-access-to-an-android-apps-resources

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!