我能动态获取getResources.getString吗?

9

我试图使用 string.xml 中的一些 Strings 填充一个 Spinner。我尝试按照如下方式实现:

   final List<String> list = new ArrayList<String>();
   for (int i = 0; i < 86; i++) {
      String resource = "R.string." + ntpServers[i][0];
      list.add(getResources().getString(resource));
   }

我有以下类似的字符串。

<string name="AT">Austria</string>
<string name="BY">Belarus</string>
<string name="BE">Belgium</string>

我需要翻译的内容如下:

我从一个地理编码器中获取了国家代码,例如AT、BY等,它们存储在ntpServers数组中。我想用对应字符串中保存的名称填充微调器,但我不能使用getResources().getString(resource),因为resource是一个String而不是int

我该怎么解决这个问题呢?

谢谢你的建议。

P.D.:

我得到了以下序列:

例如:

geocoder.getCountry() = ES --> ntpServers[36][0] = ES --> R.string.ES = """Spain""" 

我需要在下拉框中选择的字符串。

____________________________

这是我现在尝试做的事情。我正在使用getIdentifier

final List<String> list = new ArrayList<String>();
for (int i = 0; i < 86; i++) {
   String resource = "R.string." + ntpServers[i][0];
   Log.i("RESOURCE", resource);
   Log.i("getResource", "" + getResources().getIdentifier(resource, "string", getPackageName()));
                list.add(getResources().getString(getResources().getIdentifier(resource, "string", getPackageName())));
}

这是日志记录

09-18 19:32:43.815: I/RESOURCE(31268): R.string.Global
09-18 19:32:43.815: I/getResource(31268): 0
09-18 19:32:43.815: W/ResourceType(31268): No package identifier when getting value for resource number 0x00000000
09-18 19:32:43.815: D/AndroidRuntime(31268): Shutting down VM
09-18 19:32:43.815: W/dalvikvm(31268): threadid=1: thread exiting with uncaught exception (group=0x40fa92a0)
09-18 19:32:43.815: E/AndroidRuntime(31268): FATAL EXCEPTION: main
09-18 19:32:43.815: E/AndroidRuntime(31268): android.content.res.Resources$NotFoundException: String resource ID #0x0
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.content.res.Resources.getText(Resources.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.content.res.Resources.getString(Resources.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at victor.martin.gplace.MainActivity$3.run(MainActivity.java:790)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Handler.handleCallback(Handler.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Handler.dispatchMessage(Handler.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.os.Looper.loop(Looper.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at android.app.ActivityThread.main(ActivityThread.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at java.lang.reflect.Method.invokeNative(Native Method)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at java.lang.reflect.Method.invoke(Method.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
09-18 19:32:43.815: E/AndroidRuntime(31268):    at dalvik.system.NativeStart.main(Native Method)

这是R.java文件:

public static final class string {
        public static final int AE=0x7f080049;
        public static final int AO=0x7f08005b;
        ...
        public static final int Global=0x7f080008;

让我们看看你是否能为我提供更多指导。

永远感谢 ^^


请查看文档中的String Array,链接为http://developer.android.com/guide/topics/resources/string-resource.html#StringArray,这似乎更符合您的需求。 - Eluvatar
5个回答

9

使用 string-array 如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="item">
        <item>AT</item>
        <item>BY</item>
        <item>BE</item>
    </string-array>
</resources>


Resources res = getResources();
String[] array = res.getStringArray(R.array.item);

将数组转换为列表

List list = Arrays.asList(array);

/* 根据您的要求 */ 为了解决您的问题,使用HashMap将数据以键值对的形式存储。

public HashMap<String, String> getCountryCode() {
        HashMap<String, String> countryCode = new HashMap<String, String>();
        countryCode.put("IN", "INDIA");
        countryCode.put("ES", "Spain");
        countryCode.put("USA", "United States of America");

        return countryCode;
    }

String countryName= getCountryCode().get(geocoder.getCountry());

希望这可以解决您的问题。

这不完全是我正在寻找的,但它是一个很好的解决方案。谢谢。 - Víctor Martín
@Victor_J_Martin 我编辑了我的答案。希望这对你有用。 - Amit Gupta
我不知道HashMap的存在。但是使用R.string的想法是为了多语言目的。我可以用HashMap做同样的事情吗?非常感谢。 - Víctor Martín

9

正如@Henry建议我的那样,我已经使用了以下代码的getIdentifier函数:

list.add(getResources().getString(getResources().getIdentifier(ntpServers[i][0], "string", getPackageName())));

问题在于我们需要找到的资源名称不需要前缀“R.string”,只需要名称即可。
感谢大家。

1
您还可以使用Resources.getIdentifier方法(请参见此处),该方法将资源名称转换为int资源标识符。但是,这比使用数组要慢。

当我尝试使用getIdentifier时,我加了一些信息。 - Víctor Martín
1
@Victor_J_Martin 资源名称不应包含“R.string”前缀。在示例中只需使用“Global”。 - Henry
谢谢@Henry,它在前缀“R.string”处失败了;)非常感谢您。这是正确的形式:list.add(getResources().getString(getResources().getIdentifier(ntpServers[i][0], "string", getPackageName()))); - Víctor Martín
我重新接手了这个项目以更新版本。但是以前我使用的是Eclipse IDE,现在我使用的是Android Studio。现在,list.add(...)被Android Studio标记为错误,并告诉我“期望字符串类型的资源”。我不知道问题出在哪里。如果你能帮助我,我将不胜感激。 - Víctor Martín
1
请将其转化为一个新的问题,需要更多细节才能确定问题所在。 - Henry
谢谢,目前它可以编译和运行,尽管有错误。如果以后出现更多问题,我会发布它。谢谢。 - Víctor Martín

0

试一下这个

在strings.xml中使用数组

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="items">
        <item>Austria</item>
        <item>Belarus</item>
        <item>Belgium</item>
    </string-array>
</resources>

填充下拉列表

Spinner sp = (Spinner) findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(ActivityName.this, R.array.item, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
sp.setAdapter(adapter);

0

这是另一种类似的解决方案,但它使用了Collections帮助类:

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="countries">
        <item>Austria</item>
        <item>Belarus</item>
        <item>Belgium</item>
    </string-array>
</resources>

-

    String[] countryNames = getResources().getStringArray(R.array.countries);
    List<String> countryList = new ArrayList<String>();

    Collections.addAll(countryList, countryNames); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接