如何从Android的枚举的ToString访问资源string?

在我的应用程序中,我有一个微调从一个枚举填充:

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显示的枚举值的友好名称。 目前我的枚举有硬编码的友好名称的string,但我想移动到strings.xml来支持本地化。

但是,toString没有访问Context所以我不知道如何解决资源ID。

有什么办法让一个枚举的toString()方法中的本地化string?

Solutions Collecting From Web of "如何从Android的枚举的ToString访问资源string?"

如果我正确地理解了这一点,那么真正的问题是如何从你的enum获得一个Context ,这样你就可以调用Context.getString()来获得你需要的string的本地化版本。

一种方法是在应用程序的onCreate()方法中设置一个types为Context的静态成员variables,在本答案中对此进行了描述。 这里的想法是,每当您的应用程序被创build或重新创build时,您都会在容易获取的variables中保留应用程序上下文。

然后,在枚举值的构造函数中传入资源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); } } 

@Override public String toString(){return App.getContext()。getString(id); }

重要的是,你的枚举类没有任何关系到你的活动,因为如果你想在另一个应用程序中使用,那么你将无法如果你引用一个静态上下文。

所以更好的方法是将string的资源ID返回给活动,然后让活动使用它们的id来获取string。

所以从你的enum类你会有一个类似于这样的方法:

  public int getResourceId() { return resourceId; } 

然后在你的活动中,我会build立一个包含一个数组列表的列表:

 final List<String> enumList = new ArrayList<String>(); for ( final MyEnum status : MyEnum.values() ) { enumList.add( getString( status.getResourceId() ) ); } 

然后你可以使用ArrayAdapter的enumList,宾果:)

所以现在你和enum类没有任何联系,所以如果你的另一个应用需要使用相同的enum类,那么你很容易就可以这样做。

使用静态应用程序总是一个不好的做法,因为它不仅打破了即时运行,而且这也违背了解耦原则,使得模块化难以实现。 更何况Android实际上在单个进程中支持多个应用程序。

出于这个原因,我build议为enum定义一个内部类作为你的适配器条目。

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

然后,为适配器构build一个Example.Entry数组。

 Arrays.stream(Example.values()).map(item -> item.new Entry(context)).toArray(Example.Entry[]::new) 

我不是100%肯定我明白你在问什么。

有什么办法让一个枚举的toString()方法中的本地化string?

你当然可以myEnum里面的toString()方法来改变它的显示方式:

 public enum myEnum { ONE("1"), TWO("2"); private String pretty; private myEnum(String pretty) { this.pretty = pretty; } @Override public String toString() { // you can localise this string somehow here return pretty; } }