前缀字符串资源标识符以在运行时选择备用版本

时间:2013-06-11 01:42:07

标签: java android android-resources

通常,我使用以下方法从资源XML获取字符串值:

String mystring = getResources().getString(R.string.mystring);

现在,我想根据某些运行时条件选择字符串的备用版本。

String selectivestring;
if (someBooleanCondition)
  selectivestring= getResources().getString(R.string.mystring);
else 
  selectivestring= getResources().getString(R.string.theirstring);

到目前为止一切顺利,但由于我有很多这样的“替代字符串对”,我想有条不紊地为一种类型(比如“my_”)和替代类型(比如“alt _”)添加前缀:

String selectivestring1;
if (someBooleanCondition)
  selectivestring1= getResources().getString(R.string.my_string1);
else 
  selectivestring1= getResources().getString(R.string.alt_string1);
.
.
.
String selectivestring2;
if (someBooleanCondition)
  selectivestring2= getResources().getString(R.string.my_string2);
else 
  selectivestring2= getResources().getString(R.string.alt_string2);

(上面的代码仅供参考。我最终想做的是参数化这个,以便我可以把它放在循环,数组或自己的访问器中)

如果Java中有预处理器,我可以使用字符串连接来选择“my_”与“alt_”前缀。但是,既然我知道没有,有没有办法,解决方法或建议在运行时修改字符串资源标识符,如上所述?

注意:每个字符串的备用版本为not,使用不同的语言/区域设置。我基本上试图将字符串的原始版本和备用版本保持在一起,彼此相邻,在同一资源文件中,以便我可以轻松地比较这两者。

1 个答案:

答案 0 :(得分:1)

首先,您的代码可能会更好一点:

int resource = 
   someBooleanCondition ? 
       R.string.my_string2 : R.string.alt_string2;
String selectivestring2 = getResources().getString(resource);

正如您所描述的那样,可以通过反射完成,这是一个非常简单的例子:

package br;
import java.lang.reflect.Field;

final class R {
    public static final class string {
        public static final int alt_string1=0x7f060601;
        public static final int alt_string2=0x7f060101;
    }
}
public class StaticReflection {

    public static boolean globalVariable = false;

    //this would be android method getString
    public static String fakeGetString(int id){
        switch (id){
        case R.string.alt_string1: return "it";
        case R.string.alt_string2: return "works";
        default:
            return "O NOES";
        }
    }

    //static method
    public static String getResource(String resId) throws Exception {
        if (globalVariable){
            resId += "string1";
        } else {
            resId += "string2";
        }
        Field f = R.string.class.getDeclaredField(resId);
        Integer id = (Integer) f.get(null);
        return fakeGetString(id);
    }

    public static void main(String[] args) throws Exception {
        globalVariable=true;
        System.out.println(getResource("alt_"));
        globalVariable=false;
        System.out.println(getResource("alt_"));
    }
}