20

在我的应用程序中,我有一个从枚举中填充的 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 无权访问 aContext所以我不确定如何解析资源 ID。

有没有办法在枚举的 toString() 方法中获取本地化字符串?

4

4 回答 4

34

如果我理解正确,这里真正的问题是如何Context从您的中获取 a enum,以便您可以调用Context.getString()以获取所需字符串的本地化版本。

Context一种方法是在应用程序的方法中设置类型的静态成员变量onCreate(),这在此答案中进行了描述。这里的想法是,每次创建或重新创建您的应用程序时,您都将在一个易于获取的变量中保留应用程序上下文。

然后,在枚举值的构造函数中传入资源 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);
    }
}
于 2012-09-27T18:05:07.667 回答
6

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

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

因此,更好的方法是将字符串的资源 id 返回给活动,然后让活动使用他们的 id 获取字符串。

因此,从您的枚举类中,您将有一个类似于以下内容的方法:

    public  int getResourceId()
  {
    return resourceId;
  }

然后在您的活动中,我将建立一个包含数组列表的列表:

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

然后你可以使用 enumList 和你的 ArrayAdapter,Bingo :)

因此,现在您与 enum 类没有任何联系,因此,如果您构建另一个需要使用相同 enum 类的应用程序,您可以轻松地做到这一点。

于 2013-11-25T16:34:06.307 回答
4

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

出于这个原因,我建议为枚举定义一个内部类作为您的适配器条目。

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

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

Arrays.stream(Example.values()).map(item -> item.new Entry(context)).toArray(Example.Entry[]::new)
于 2016-11-28T08:22:58.713 回答
1

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

有没有办法在枚举的 toString() 方法中获取本地化字符串?

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

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;
    }
}
于 2012-09-27T17:54:05.390 回答