Java 如何从enum';Android中的ToString是什么?

Java 如何从enum';Android中的ToString是什么?,java,android,Java,Android,在我的应用程序中,我有一个从枚举填充的微调器: ArrayAdapter<myEnum> enumAdapter = new ArrayAdapter<Stroke> (parentActivity.getApplicationContext(), R.layout.simple_spinner_item, myEnum.values()); enumAdapter.setDropDownViewResource(R.layout.simple_spinner_dropd

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

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);
ArrayAdapter enumAdapter=new ArrayAdapter(parentActivity.getApplicationContext(),R.layout.simple_spinner_item,myEnum.values());
enumAdapter.setDropDownViewResource(R.layout.simple\u微调器\u下拉菜单\u项);
enumSpinner.setAdapter(strokeAdapter);
这将使用枚举的
toString()
方法的重写来获取枚举值的友好名称,以显示在
微调器中。目前,我的enum为友好名称硬编码了字符串,但我想将它们移动到
strings.xml
以支持本地化

但是,toString无法访问
上下文
,因此我不确定如何解析资源ID


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

我不能100%确定我是否理解您的要求

在枚举的toString()方法中是否有获取本地化字符串的方法

您当然可以
@覆盖
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;
    }
}

如果我理解正确,这里真正的问题是如何从
枚举
中获取
上下文
,以便调用
Context.getString()
,获取所需字符串的本地化版本

一种方法是在应用程序的
onCreate()
方法中设置
Context
类型的静态成员变量,如中所述。这里的想法是,每次创建或重新创建应用程序时,您都会将应用程序上下文保存在一个易于访问的变量中

然后,在枚举值的构造函数中传入资源ID,并在
toString()
方法中使用上下文

例如:

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);
    }
}
@凌驾 公共字符串toString() { 返回App.getContext().getString(id); }

很重要的一点是,枚举类与活动没有任何关联,因为如果要在另一个应用程序中使用,则无法在引用静态上下文时使用

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

因此,从enum类可以看到一个类似于以下内容的方法:

    public  int getResourceId()
  {
    return resourceId;
  }
然后在您的活动中,我将建立一个包含arraylist的列表:

final List<String> enumList = new ArrayList<String>();
for ( final MyEnum status : MyEnum.values() )
{
  enumList.add( getString( status.getResourceId() ) );
}
final List enumList=new ArrayList();
对于(最终MyEnum状态:MyEnum.values())
{
添加(getString(status.getResourceId());
}
然后您可以将enumList与ArrayAdapter一起使用,宾果:)


因此,现在您与enum类没有任何关系,因此,如果您构建的另一个应用程序需要使用相同的enum类,您可以轻松地执行此操作。

使用静态应用程序始终是一种不好的做法,因为它不仅破坏了即时运行,而且违反了解耦原则,因此很难实现模块化。更不用说Android实际上在一个进程中支持多个应用程序

因此,我建议为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); }
    }
}
然后,为适配器构建Example.Entry数组

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

枚举只是类的简写。创建一个执行此工作的单例类。然后,toString()方法可以访问它想要访问的任何内容。为什么要使用实际的字符串?例如,大多数
View.setText()
也可以使用resourceID。以类似的方式,选项生成器可以使用ResourceID数组而不是字符串数组。我正在寻找一种方法,使用Android R.string.foo ID在toString方法中查找字符串的翻译版本,在toString方法中,您通常无法访问应用程序上下文。是的,访问上下文让我感到困惑。谢谢我有一个解决方案,它使枚举中的字段变得不必要:如何在枚举中查找
hello
字符串以获取Example.hello返回?我认为这样做更好,因为它避免了应用程序中的静态上下文。