如何从Android中的枚举ToString访问资源字符串?

for*_*kes 19 java android

在我的应用程序中,我有一个由枚举填充的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);
Run Code Online (Sandbox Code Playgroud)

这使用了枚举toString()方法的覆盖来获取要在其中显示的枚举值的友好名称Spinner.目前我的enum有友好名字的字符串硬编码,但我想将它们移动strings.xml到支持本地化.

但是,toString无权访问,Context因此我不确定如何解析资源ID.

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

wsa*_*lle 26

如果我理解正确的话,那么真正的问题是如何Context从你那里得到一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我有一个解决方案,使enum中的字段不必要:http://stackoverflow.com/a/29625457/1891118 (3认同)

Sam*_*oid 5

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

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

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

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

    public  int getResourceId()
  {
    return resourceId;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

然后可以将enumList与ArrayAdapter Bingo一起使用:)

因此,现在您与枚举类没有关系,因此,如果您要构建另一个需要使用相同枚举类的应用,则可以轻松做到这一点。