2011-04-20 36 views
3

在我的应用程序中,我只需要一些具有良好名称的全局值。 首先,我所做的就是将它们全部作为“公共静态最终”组件整合到一个单独的类中。Android:我如何在交换机中使用res/integers.xml值?

然后我意识到我对全局字符串(将它们放到res/strings.xml中并使用它们通过getString(R.string.string_name))所做的操作也应该用整数。

不过,我第一次发现,有没有这样的东西作为getInteger(R.integer.integer_name),但只有相当长的路:

Resources r = getResources(); 
int integer = getInteger(R.integer.integer_name); 

其次,当我尝试在使用的值开关/表达式我只收到消息“case表达式必须是常量表达式”。

无论如何,使用res/integers.xml有什么意义?我只是把我的整数回一些无用的类...

亲切的问候, 水母

回答

2

因为我们总是需要常量或枚举开关/ case语句(< - ENUMS !!)在案件陈述。变量允许用于switch参数,但参数case不得更改。

所以,如果你需要“存储”的情况下,参数和喜欢漂亮的名字,下降integers.xml(没有解决你的问题),以及static final public int的 - 实现一个enum而不是全局值模型。


只是等待一些细节提出一个枚举的解决方案;)在这里,我们去:

public enum Value{ VALUE_ONE(300), VALUE_TWO(501), UNKNOWN(-1); 
    private int value; 
    private Value(int value) {this.value = value;} 

    public int getValue() { 
    return value; 
    } 

    public Value findValue(int value) { 
    for (Value v:values()) { 
     if (v.value == value) 
      return v; 
    } 
    return Value.UNKNOWN; 
} 

findValue可以用来得到一个数值枚举,该UNKNOWN是返回一个替代null如果我们寻找一个未知的数字。玩得开心:)

+0

我以前曾经想过关于枚举,但是我认为它对我而言并不起作用。我需要确保例如VALUE_ONE = 300和VALUE_TWO = 502.另外,我确实得到了整数值(我无法改变),我必须与我的常量进行比较。开关/外壳似乎不允许这样做(就像在C/C++中一样)。但无论如何,integers.xml无法帮助我的答案足以回答。 :) – jellyfish 2011-04-20 09:32:23

0

实际上做的是在strings.xml或其他自定义xml文件中创建一组值,并给它们一个描述性名称。这些值在编译时会变成静态的,每个xml值都是静态的,然后我可以通过它们的id来引用它们。

所以在XML我做的:

<string name="descriptive_name_that_is_easily_read_in_switch_case"> 
        What I put here really doesn't matter</string> 

然后在开关/箱

switch(someValue){ 
    case R.id.descriptive_name_that_is_easily_read_in_switch_case:{ 
     <code> 
    } 
    break; 
} 

这样做的好处是,我可以从代码中删除枚举/静态初始化了,使它更具可读性,并且仍然在整个程序中重用这些值。

课程有些时候,您只希望您的枚举/静态值在某个类或方法中可见。那么这不是你会做的。

相关问题