如何将枚举映射到String资源?

时间:2017-03-21 03:00:09

标签: java android enums

我有一个枚举类型Pet的列表。

enum Pet
{
   DOG, CAT, BIRD, FISH;
}

然后我在商店加载可用宠物列表,最终以List

结尾
List<Pet> availablePets;

宠物的数量会有所不同。因此,有时候商店会有DOGCAT其他时间会有所有宠物。

问题是我必须显示宠物清单。因此,由于语言不同,我必须使用String资源显示宠物类型。

public void display()
{
    CharSequence[] list = new CharSequence[availablePets.size()];

    for(int i = 0; i < availablePets.size(); i++)
    {
        Pet pet = availablePets.get(i);
        if(pet == Pet.DOG)
        {
            list[i] = getString(R.string.dog);
        }
        else if(pet == Pet.CAT)
        {
            list[i] = getString(R.string.cat);
        }
        ...
    }

    // takes a CharSequence array
    callUi(list);
}

我的问题是这不会扩展。一个新的宠物进入的那一刻,我必须修改大量的代码只是为了显示它。

那么如何使用String资源打印这个枚举列表?

1 个答案:

答案 0 :(得分:0)

R.string.xxx值实际上是整数,然后由getString()用于查找要显示的相应字符串。所以你需要解决的问题是如何将你的枚举值(DOG,CAT等)映射到适当的整数。

有几种方法可以做到这一点:

- 创建一个映射它们的Map,然后在需要显示它时查找相应的整数以传递给getString:

Map<Pet, Integer> petTypeToNameMapping = new HashMap<>();
petTypeToNameMapping.put(Pet.DOG, R.string.dog);
...

list[i] = getString(petTypeToNameMapping.get(pet));

- 在Pet enum本身中嵌入字符串资源ID(当您想要将一些附加信息与每个枚举值相关联时,可以给出枚举成员变量和构造函数,如常规类):

enum Pet {
    DOG(R.string.dog), CAT(R.string.cat);

    int nameResourceId;
    Pet(int nameResourceId) {
        this.nameResourceId = nameResourceId;
    }
}

...

list[i] = getString(pet.nameResourceId);