使用xml引用字符串数组资源中的字符串

时间:2010-11-12 03:00:11

标签: android xml reference preferences arrays

我有一些首选项,您可以在其中启用/禁用菜单上显示的项目。共有17项。我在values / arrays.xml中创建了一个字符串数组,其中包含17个项目的标题。

我有preferences.xml,它有我的首选项文件的布局,我想引用字符串数组中的一个项目作为标题。

我该怎么做?

在Android开发人员参考中,我看到我如何使用XML引用单个字符串,但不知道如何使用XML引用数组资源中的字符串。

5 个答案:

答案 0 :(得分:310)

简而言之:我认为你不能,但似乎有一种解决方法:

如果您在这里查看Android资源:

http://developer.android.com/guide/topics/resources/string-resource.html

您可以看到,在数组部分(至少是字符串数组)下,“RESOURCE REFERENCE”(从XML获取)未指定解决各个项目的方法。您甚至可以尝试在XML中使用“@ array / yourarrayhere”。我知道在设计时你会得到第一个项目。但是,如果你想使用,那就没有实际用处,当然,让我们说第二个。

但是,你可以做一个技巧。见这里:

Referencing an XML string in an XML Array (Android)

您可以通过在数组定义中查询独立字符串来“欺骗”(不是真的)数组定义。例如,在strings.xml中:

<string name="earth">Earth</string>
<string name="moon">Moon</string>

<string-array name="system">
    <item>@string/earth</item>
    <item>@string/moon</item>
</string-array>

通过使用它,您可以在“android:text”和“android:title”XML字段中正常使用“@ string / earth”和“@ string / moon”,但您不会失去首先将数组定义用于您想要的任何目的。

似乎在我的Eclipse上工作。你为什么不试着告诉我们它是否有效? : - )

答案 1 :(得分:201)

也许这会有所帮助:

String[] some_array = getResources().getStringArray(R.array.your_string_array)

所以你把数组列表作为String [],然后选择任何i,some_array [i]。

答案 2 :(得分:61)

更好的选择是将资源返回的数组用作数组, 意思是:

getResources().getStringArray(R.array.your_array)[position]

这是上述方法的捷径,但是以您想要的方式工作。否则android不会为基于xml的数组提供直接的XML索引。

答案 3 :(得分:9)

不幸的是:

  • 您似乎无法使用XML在values / arrays.xml中引用数组中的单个项目。当然,您可以使用Java,但不能使用XML。在Android开发者参考中没有关于这样做的信息,我在其他任何地方都找不到。

  • 您似乎无法将数组用作首选项布局中的键。每个密钥必须是一个带有自己密钥名称的值。

我想要完成的事情: 我希望能够循环遍历17个首选项,检查项是否被选中,如果是,则从字符串数组中加载该首选项名称的字符串。

以下是我希望完成此任务的代码:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());  
ArrayAdapter<String> itemsArrayList = new ArrayAdapter<String>(getBaseContext(),   android.R.layout.simple_list_item_1);  
String[] itemNames = getResources().getStringArray(R.array.itemNames_array);  


for (int i = 0; i < 16; i++) {  
    if (prefs.getBoolean("itemKey[i]", true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
} 

我做了什么:

  • 我为每个项目设置了一个字符串,并引用了单个字符串。我使用首选项布局复选框标题的单字符串引用,以及我的循环数组。

  • 要遍历首选项,我只需将键命名为key1,key2,key3等。由于您使用字符串引用键,因此可以选择在运行时“构建”键名。 / p>

这是新代码:

for (int i = 0; i < 16; i++) {  
        if (prefs.getBoolean("itemKey" + String.valueOf(i), true)) {  
        itemsArrayList.add(itemNames[i]);  
    }  
}

答案 4 :(得分:0)

另一种方法是在strings.xml中定义一个资源数组,如下所示。

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE resources [
    <!ENTITY supportDefaultSelection "Choose your issue">
    <!ENTITY issueOption1 "Support">
    <!ENTITY issueOption2 "Feedback">
    <!ENTITY issueOption3 "Help">
    ]>

然后使用上述资源定义字符串数组

<string-array name="support_issues_array">
        <item>&supportDefaultSelection;</item>
        <item>&issueOption1;</item>
        <item>&issueOption2;</item>
        <item>&issueOption3;</item>
    </string-array>

您也可以将相同的字符串引用到其他xmls中,同时保持DRY不变。 我看到的优点是,通过单个值更改,它将影响代码中的所有引用。