У меня есть проблема в отношении. ресурсы приложения Android:
В моем приложении есть разное. режимы (edit / plan / exec), которые я хотел бы описать, используя тип перечисления. Я буду, однако, я хотел бы заполнить значения перечисления строками, которые происходят из файла ресурса 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; }
}
, которое, например, позволило бы изменять имена режимов, используя файл ресурсов и, таким образом, позволяют последующие изменения имени без изменений кода, интернационализации и т. д.
Проблема в том, что стандартный доступ к ресурсам осуществляется через метод getResources () Activity, который доступен только в конструкторе (и во время выполнения). методы экземпляра). Однако объявление перечисления является частью статического кода инициализации класса. Есть ли способ получить статический доступ к ресурсам приложения?
Майкл
Спасибо, radek-k, за примеры! Тем временем я сам придумал несколько похожую идею, а именно я добавил статический метод в перечисление, которому я затем передаю дескриптор ресурса во время метода Activity onCreate(). Это позволяет методу toString() получить доступ к строкам ресурсов. ИМХО не очень элегантно, но работает...
Cheers, Майкл
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();
и в вашем режиме перечисления
:
@Override
public String toString() {
Resources res = ClassName.res;
if (res==null){ return super.toString(); }
else { return res.getText(id); }
}