我有一个枚举,我需要将值显示为本地化字符串。我目前的做法是:
public enum MyEnum {
VALUE1(R.string.VALUE1),
VALUE2(R.string.VALUE2),
.
.
VALUE10(R.string.VALUE10);
private int mResId = -1;
private MuEnum(int resId) {
mResId = resId;
}
public String toLocalizedString(Resources r) {
if (-1 != mResId) return (r.getString(mResId));
return (this.toString());
}
}
有没有更简单的方法来做到这一点?如果我能以某种方式根据枚举值名称(即'VALUE1')查找资源,我会喜欢它。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="VALUE1"/>My string</string>
<string name="VALUE2"/>My string 2</string>
.
.
<string name="VALUE10"/>My string 3</string>
</resources>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
编辑:仅供将来参考,这是最适合我的解决方案:
public enum MyEnum {
VALUE1,
VALUE2,
.
.
VALUE10;
/**
* Returns a localized label used to represent this enumeration value. If no label
* has been defined, then this defaults to the result of {@link Enum#name()}.
*
* <p>The name of the string resource for the label must match the name of the enumeration
* value. For example, for enum value 'ENUM1' the resource would be defined as 'R.string.ENUM1'.
*
* @param context the context that the string resource of the label is in.
* @return a localized label for the enum value or the result of name()
*/
public String getLabel(Context context) {
Resources res = context.getResources();
int resId = res.getIdentifier(this.name(), "string", context.getPackageName());
if (0 != resId) {
return (res.getString(resId));
}
return (name());
}
}
答案 0 :(得分:21)
您当然可以使用Resources.getIdentifier()
按名称查找资源。例如,使用您发布的字符串资源作为示例,您可以通过以下活动执行此操作:
Resources res = getResources();
MyEnum e = MyEnum.VALUE1;
String localized = res.getString(res.getIdentifier(e.name(), "string", getPackageName()));
从视图中,您必须将最后一个参数更改为getContext().getPackageName()
答案 1 :(得分:6)
我认为你所尝试的很好,除非你每次想要翻译枚举时都不需要将参数传递给枚举。
使用link子类化Application Class,然后按照这种方法。
import android.app.Application;
public enum MyEnum {
VALUE1(R.string.VALUE1),
VALUE2(R.string.VALUE2),
.
.
VALUE10(R.string.VALUE10);
private int resourceId;
private MyEnum(int id) {
resourceId = id;
}
@Override
public String toString() {
return MyApplication.getApplicationContext().getString(resourceId);
}
}
然后调用MyEnum.VALUEx
将始终为您提供翻译的枚举值,但要小心这可能不是您想要的例如您可能有原始查询如下:
select * from Customer where userStatus = MyEnum.VALUEx.toString();
如果您将枚举值存储为数据库中的VALUE1,VALUE2 ...,这可能会破坏您的应用,所以当您不想使用{{1}的翻译值时,请记住使用此MyEnum.VALUEx.name()
}}
MyEnum
答案 2 :(得分:3)
使用静态应用程序总是不好的做法,因为它不仅打破了Instant Run,而且还违背了编程的解耦原则,从而使模块化难以实现。更不用说Android实际上只在一个进程中支持多个应用程序。
出于这个原因,我建议为运行时创建的枚举定义一个内部类,只要可以更改语言环境。
number=$(awk '/^MemTotal:/ {printf("%.1f", $2 / 2048)}' /proc/meminfo)
然后,构建Example.Entry实例或Example.Entry数组,以表示原始枚举的本地化版本。
enum Example {
A(R.string.label_a),
B(R.string.label_b);
Example(@StringRes int label) { mLabel = label; }
private @StringRes int mLabel;
class Entry {
private Context mContext;
Entry(final Context context) { mContext = context; }
@Override public String toString() { return mContext.getString(mLabel); }
}
}
答案 3 :(得分:1)
如果你是你的应用程序类的子类,你可以把它作为单例(参见:http://androidcookbook.com/Recipe.seam?recipeId = 1218)一旦你得到你的 单例实例,您可以在toLocalizedString()中使用它来获取资源对象 并摆脱参数:
public String getString() {
return YourApp.getInstance().getResources().getString(resId);
}
瞧 - 现在你看起来很干净。
答案 4 :(得分:0)
首先创建新类:
import android.app.Application;
public class MyApplication extends Application {
private static MyApplication singleton;
public static MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
现在在AndroidManifest.xml中添加对应用程序类的引用:
<application ... android:name="com.yourPackageName.application.MyApplication ">
接下来创建你的枚举。性别的示例枚举:
public enum Gender {
MALE(0, R.string.male),
FEMALE(1, R.string.female);
private Integer resourceId;
private Integer index;
private static final Map<Integer, Gender> lookupIndex = new HashMap<Integer, Gender>();
private static final Map<Integer, Gender> lookupResourceId = new HashMap<Integer, Gender>();
private static final Map<String, Gender> lookupTranslation = new HashMap<String, Gender>();
static {
for (Gender g : values()) {
lookupIndex.put(g.getIndex(), g);
lookupResourceId.put(g.getResourceId(), g);
lookupTranslation.put(g.toString(), g);
}
}
private Gender(Integer index, Integer displayText) {
this.resourceId = displayText;
this.index = index;
}
public Integer getIndex() {
return this.index;
}
public Integer getResourceId() {
return this.resourceId;
}
public static Gender findByIndex(Integer index) {
return lookupIndex.get(index);
}
public static Gender findByResourceId(Integer id) {
return lookupResourceId.get(id);
}
public static Gender findByTranslationText(String text) {
return lookupTranslation.get(text);
}
@Override
public String toString() {
return MyApplication.getInstance().getResources().getString(this.resourceId);
}}
现在您可以使用请求的查找模式:
// by index
Gender male = Gender.findByIndex(0);
// by translation
String femaleTranslated = context.getResources().getString(R.string.female);
Gender gender = Gender.findByTranslationText(femaleTranslated);
// by id
Gender gender = Gender.findByResourceId(R.string.female);
感谢AhmetYüksektepe
答案 5 :(得分:0)
enum class MeasurementEnum(var position: Int, @StringRes
var userRedableStringRes: Int) {
False(0, R.string.boolean_false),
True(1,R.string.boolean_true)
}