将enum与字符串资源和微调器一起使用

时间:2018-02-05 16:54:22

标签: java android enums

我想将enum用于我未来的编码,因为它似乎比使用字符串更合法。虽然,我遇到了一些问题。

  1. 我只是想将一个字符串存储在一个常量中,每当我访问它时它都会给我输出字符串,所以我尝试了以下内容:

    public enum Fruit {
        AP("Apple"),
        BA("Banana");
    
        private String str;
    
        Fruit(String str) {
            this.str = str;
        }
    
        public String toString() {
        return str;
        }
    }
    
  2. 问题是每当我访问它时,它都会返回null。因此,我想我需要在访问它之前为每个枚举定义Fruit()的值:

    String fruit = Fruit.AP.toString(); //NULL
    

    所以我采取了不同的方法:

    public enum Fruit {
        AP, BA;
        public String toString(){
            switch (this) {
                case AP: return "Apple";
                case BA: return "Banana";
            }
            return null;
        }
    }
    

    但很快我注意到引用字符串资源会更有意义,但我无法在交换机中返回R.string.apple。那么我该如何解决这个问题呢?第一个返回null,第二个不返回字符串资源。

    1. 我想稍后在微调器中使用这些值。使用Fruit.values();
    2. 是否合法?

      感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

在枚举中创建一个方法以返回str值

public enum Fruit {
    AP("Apple"),
    BA("Banana");

    private String str;

    Fruit(String str) {
        this.str = str;
    }

    public String getStr() {
        return str;
    }
}

然后您可以使用Fruit.AP.getStr();访问该内容并返回您之后的内容;)

是的,您可以使用Fruit.values();

遍历所有值

答案 1 :(得分:0)

  

问题是每当我访问它时,它都会返回null。因此,我想我需要在访问它之前为每个枚举定义Fruit()的值:

String fruit = Fruit.AP.toString(); //NULL

我认为没有理由这样做。事实上,如果我将enum定义复制/粘贴到我的IDE并尝试访问Fruit.AP.toString(),我就会成功地看到" Apple"在我的输出中。

我唯一关注的是你的enum定义包括:

private String str;

我认为您应该将其声明为private final String str;您不希望str的值在应用运行时的过程中发生变化。 可能您的代码中的某些内容正在执行奇怪的操作,例如Fruit.AP.str = null,这可能会导致您的问题。

  

但很快我注意到引用字符串资源会更有意义,但我无法在交换机中返回R.string.apple。那么我该如何解决这个问题?

你有两个选择。两者都涉及稍微改变你的枚举定义(类似这样):

public enum Fruit {

    AP(R.string.apple),
    BA(R.string.banana);

    private final int strId;

    Fruit(int strId strId) {
        this.strId = strId;
    }
}

从这里,您可以只检索字符串资源ID,然后像普通字符串资源ID一样使用它:

myTextView.setText(Fruit.AP.getStrId());
// or
String apple = getString(Fruit.AP.getStrId());

或者您可以在enum上创建一个接受Context实例的方法并直接返回字符串:

public String getString(Context context) {
    return context.getString(strId);
}

然后像这样使用它:

String apple = Fruit.AP.getString(MainActivity.this);