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

问题描述 投票:0回答:7

我有一些偏好设置,您可以在其中启用/禁用菜单上显示的项目。有 17 项。我在 value/arrays.xml 中创建了一个字符串数组,其中包含这 17 个项目中每一个的标题。

我有preferences.xml,其中包含我的首选项文件的布局,我想引用字符串数组中的单个项目来用作标题。

我该怎么做?

在 Android 开发人员参考中,我了解了如何使用 XML 引用单个字符串,但没有了解如何从 XML 中的数组资源引用字符串。

android xml reference preferences arrays
7个回答
371
投票

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

如果您查看此处的 Android 资源:

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

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

但是,您可以使用一个技巧。请看这里:

引用 XML 数组中的 XML 字符串 (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 上工作。你为什么不尝试告诉我们它是否有效? :-)


251
投票

也许这会有所帮助:

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

因此,您获得 String[] 形式的数组列表,然后选择任意 i,some_array[i]。


75
投票

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

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

这是其他提到的方法的快捷方法,但可以按照您想要的方式工作。否则,Android 不会为基于 XML 的数组提供直接的 XML 索引。


11
投票

不幸的是:

  • 您似乎无法使用 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 等。由于您使用字符串引用键,因此您可以选择在运行时“构建”键名称。

这是新代码:

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

3
投票

另一种方法是在 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>

您也可以将相同的字符串引用到其他 xml 中,同时保持 DRY 完整。 我看到的优点是,只需更改单个值,就会影响代码中的所有引用。


0
投票

答案很容易实现。

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

现在您可以通过索引访问数组的任何元素(假设第 i 个索引),然后您可以通过 arrayName[i] 访问它

希望你能明白这一点


0
投票

Kotlin 扩展函数 - 可重用

fun Context.stringArray(array: Int): Array<String> {
    return resources.getStringArray(array)
}
© www.soinside.com 2019 - 2024. All rights reserved.