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

时间:2012-09-27 15:37:12

标签: 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);

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

但是,toString无法访问Context所以我不确定如何解析资源ID。

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

4 个答案:

答案 0 :(得分:25)

如果我理解正确,那么真正的问题是如何从Context获取enum,以便您可以致电Context.getString()获取所需字符串的本地化版本

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

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

答案 1 :(得分:4)

  

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

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

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

所以从你的枚举类中你会得到一个类似于此的方法:

    public  int getResourceId()
  {
    return resourceId;
  }

然后在你的活动中我会建立一个包含一个arraylist的列表:

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

然后你可以在你的ArrayAdapter,宾果游戏中使用enumList:)

所以现在你与enum类没有任何联系,所以如果你构建另一个需要使用相同枚举类的应用程序,你的质量很容易就可以了。

答案 2 :(得分:2)

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

因此,我建议将枚举的内部类定义为适配器条目。

class base

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

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

答案 3 :(得分:1)

我不是百分百肯定我明白你在问什么。

  

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

@Override内的toString()方法当然可以更改其显示方式:

myEnum