在我的应用程序中,我从一个枚举中填充了一个Spinner:
ArrayAdapter<myEnum> enumAdapter = new ArrayAdapter<Stroke> (parentActivity.getApplicationContext(), R.layout.simple_spinner_item, myEnum.values());
enumAdapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);
enumSpinner.setAdapter(strokeAdapter);
这使用了枚举的toString()
方法的覆盖来获取要在Spinner
中显示的枚举值的友好名称。目前我的枚举已为友好名称编码了硬编码字符串,但我想将其移至strings.xml
以支持本地化。
但是,toString无法访问Context
所以我不确定如何解析资源ID。
有没有办法在枚举的toString()方法中获取本地化字符串?
答案 0 :(得分:25)
如果我理解正确,那么真正的问题是如何从Context
获取enum
,以便您可以致电Context.getString()
获取所需字符串的本地化版本
一种方法是在应用程序的Context
方法中设置类型为onCreate()
的静态成员变量,this answer中对此进行了描述。这里的想法是,每次创建或重新创建应用程序时,您都会在易于访问的变量中保留应用程序上下文。
然后,在枚举值的构造函数中传入资源ID,并使用toString()
方法中的Context。
例如:
public enum Example {
HELLO(R.string.hello),
WORLD(R.string.world);
private int mResourceId;
private Example(int id) {
mResourceId = id;
}
@Override
public String toString() {
return App.getContext().getString(mResourceId);
}
}
答案 1 :(得分:4)
@覆盖 public String toString() { return App.getContext()。getString(id); }
重要的是,你的枚举类与你的活动没有任何联系,因为如果你想在另一个应用程序中使用,那么如果你引用一个静态的上下文,你将无法做到。
因此,更好的方法是将字符串的资源ID返回给活动,然后让活动使用其中的id获取字符串。
所以从你的枚举类中你会得到一个类似于此的方法:
public int getResourceId()
{
return resourceId;
}
然后在你的活动中我会建立一个包含一个arraylist的列表:
final List<String> enumList = new ArrayList<String>();
for ( final MyEnum status : MyEnum.values() )
{
enumList.add( getString( status.getResourceId() ) );
}
然后你可以在你的ArrayAdapter,宾果游戏中使用enumList:)
所以现在你与enum类没有任何联系,所以如果你构建另一个需要使用相同枚举类的应用程序,你的质量很容易就可以了。
答案 2 :(得分:2)
使用静态应用程序总是一种不好的做法,因为它不仅会破坏Instant Run,而且还会违反解耦原则,从而使模块化难以实现。更不用说Android实际上只在一个进程中支持多个应用程序。
因此,我建议将枚举的内部类定义为适配器条目。
class base
然后,为适配器构建一个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 final Context mContext;
Entry(final Context context) { mContext = context; }
@Override public String toString() { return mContext.getString(mLabel); }
}
}
答案 3 :(得分:1)
我不是百分百肯定我明白你在问什么。
有没有办法在枚举的toString()方法中获取本地化字符串?
您@Override
内的toString()
方法当然可以更改其显示方式:
myEnum