我有一个枚举类,但我想根据用户系统语言显示字符串。例如,如果系统是英语,则应显示1,2,3 。但如果系统是中文,显示应该完全不同,如"一",“二”,“三”。 (一个是中文1个,二个是中文2个)。
这是我的代码
public enum OrderType {
ONE("1"), TWO("2"), THREE("3")
private String name;
private OrderType(String name) {
this.name = name;
}
public String toString() {
return name;
}
public static String getEnumByString(String code) {
for (OrderType e : OrderType.values()) {
if (code.equals(e.name)) {
return e.name();
}
}
return null;
}
}
enum在android中工作正常,我可以在值文件夹中定义String,
喜欢价值观 - 价值观,价值观......我怎样才能使用它?
更新: 我还想使用构造函数来初始化枚举字符串。就像
private OrderType(String name) {
String temp = getResources().getString(R.string.name);
this.name = temp ;
}
但我不知道如何传递R.string.parameter的参数.. 第二,如何在枚举类
中使用getResources()函数答案 0 :(得分:3)
只需将字符串资源ID作为参数提供给您的枚举:
public enum OrderType {
ONE(R.string.order_type_one),
TWO(R.string.order_type_two)
private final int mTextResourceId;
OrderType(int resourceId) {
mTextResourceId = resourceId;
}
public int getTextResourceId() {
return mTextResourceId;
}
}
在每个所需的资源文件夹中提供这些字符串,例如:
res/values/strings.xml
res/values-es/strings.xml
res/values-fr/string.xml
然后,当你想在TextView
的某个地方消费时:
myTextView.setText(myOrderType.getTextResourceId());
不需要传递Context
,并且在运行时根据当前区域设置确定。
答案 1 :(得分:1)
您应该将字符串保留在字符串xml资源中。这样你就可以从那里进入你的代码。例如:
String one = getResources().getString(R.string.num_one);
然后你只需要在所需的语言文件夹中放入一个带有重载值的strings.xml文件(values-ru,values-sv等)。
答案 2 :(得分:1)
您必须知道enum
是静态初始化的。 ONE, TWO, THREE
中的每一个都是静态。
在android中使用资源,例如字符串,你需要一个context。
通常,您无法在静态方法中访问Android上下文或初始化,因此您无法在枚举中使用它们。
即使您可以使用hack使Android上下文静态可用,您仍会遇到问题:
OrderType
个枚举
修改
我希望很明显,您无法使用字符串资源可靠地初始化您的枚举。
但是,您可以将字符串(R.string.string_name
)的静态 id与您的枚举关联,然后使用上下文获取所需的资源字符串,如 kcoppock &回答。
答案 3 :(得分:0)
对于此类任务,请使用本地化。
"google on i18n java"
和
"android app localization"
答案 4 :(得分:-1)
public enum OrderType {
One(mActivity.getString(R.string.One)), Two(mActivity.getString(R.string.Two));
private String name;
private OrderType(String name) {
this.name = name;
}
public String toString() {
return name;
}
public static String getEnumByString(String code) {
for (OrderType e : OrderType.values()) {
if (code.equals(e.name)) {
return e.name();
}
}
return null;
}
}
这也是link,我认为这是解决问题的最佳方法。这是目前针对API级别11开发的,但是此代码应该在更高版本上运行。在API 16中进行快速审核之后,我没有看到针对此问题的现有核心Android解决方案,如果您知道其中一个,请在下面发布并分享。