高效访问配置文件中的多个字符串之一

时间:2012-09-14 13:31:08

标签: android string casting resources

在我的应用程序中,我有许多用于识别区域和位置的字符串。:

<string name="r1s1">Seattle</string>
<string name="r1s2">Des Moines</string>
<string name="r1s3">Bremerton</string>
<string name="r2s1">Tacoma</string>
<string name="r2s2">Burton</string> etc, etc.

我可以使用long switch语句通过字符串名称轻松访问这些字符串:

switch(regionCode
{   case 1: sN=getString(R.string.r1s1);break;
    case 2: sN=getString(R.string.r2s1);break;  etc etc

我想计算这个字符串名称并使用它来更直接地访问字符串:

stationNameKey="r"+regionCode+"s"+stationCode;// e. g. r1s1
stationName=getString(R.string.stationNameKey);

这第二个语句不正确,这里不会编译消息:

! compiler error:: stationNameKey cannot be resolved or is not a field.

我假设从String到资源名称标识符的强制转换可以工作但无法找到它。

问:如何转换字符串以使第二个语句正常工作。谢谢。

2 个答案:

答案 0 :(得分:1)

你不能这样做。资源名称在编译时用于生成资源编号。 R.string.xxx实际上是一个数字。

你可以做的是使用你在res / values / strings.xml中创建的并行字符串数组资源,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="region_keys">
        <item>r1s1</item>
        <item>r1s2</item>
        <item>r1s3</item>
        <item>r2s1</item>
        <item>...</item>
    </string-array>

    <string-array name="region_values">
        <item>Seattle</item>
        <item>Des Moines</item>
        <item>Bremerton</item>
        <item>Tacoma</item>
        <item>...</item>
    </string-array>
</resources>

在代码中,执行以下操作:

Resources res = getResources();
String[] regionKeys = res.getStringArray(R.array.region_keys);
String[] regionValues = res.getStringArray(R.array.region_values);

// Create a hash map of key/value pairs
HashMap<String, String> regions = new HashMap<String, String>();
for (int i = 0; i < regionKeys.length; i++) {
    regions.put(regionKeys[i], regionValues[i]);
}

现在,您可以在地图regions中引用字符串,如下所示:

String key = 'r1s1';
String regionString = regions.get(key);

答案 1 :(得分:1)

你应该使用Resources.getIdentifier() 请参阅thisthis

int resId = getResources().getIdentifier(stationNameKey,"string",null);

应该能够获得您需要的ID