如何在Android中从enum的ToString访问资源字符串?

2022-09-02 08:55:04

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

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()Spinnerstrings.xml

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

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


答案 1

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

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

然后,在枚举值的构造函数中传入资源 ID,并在方法中使用 Context。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);
    }
}

答案 2
@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 一起使用。宾果:)

因此,现在你与枚举类没有任何联系,因此,如果你正在构建另一个需要使用相同枚举类的应用,则可以轻松执行此操作。


推荐