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


256

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

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

我怎样才能做到这一点?

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

Answers:


331

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

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

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

您会比在数组部分(至少是字符串数组)下看到的“ RESOURCE REFERENCE”(从XML中获得)没有指定解决单个项目的方法。您甚至可以尝试在XML中使用“ @ array / yourarray此处”。我知道在设计时您将获得第一项。但是,如果您要使用的话,那实际上是没有用的。假设……第二个。

但是,有一个技巧可以解决。看这里:

在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上使用。您为什么不尝试告诉我们是否可行?:-)


32
如果我们只能给name<item> s ... * sigh *
加上

2
刚试过!在默认情况下定义了数组,strings.xml但未定义该数组,values-fr并且该数组仍使用法语版本进行了更新。错了..但是很酷!
Blundell'3

1
给任何人的快速提示:双击“地球”将突出显示地球。双击@ string / moon中的月亮将突出显示月亮。因此,如果在构建数组时多次复制第一项,则可以相当容易地在单个字符串和字符串数组之间复制和粘贴。可能会帮助您加快字符串数组的创建速度:)
ArtOfWarfare 2012年

2
只是想知道这种方法是否会比我在数组中声明字符串而不是在引用中使用而导致性能更差?
Alex Bonel

1
@AlexBonel一个有趣的问题,老实说我不知道​​。即使可以,我认为我们也应该将这种非常微小的优化留给编译器。无论如何,它们不是在行内的某个地方结束内联吗?我猜他们会的,但是我不确定。至少在Android链的更高层次上,我知道您可以使用apktool完全分解APK,它将恢复字符串键的原始名称,这意味着引用的声明(如上面的声明)将得以保留。但是我现在对该领域不太感兴趣,因此我无法回答您的问题。不过,这是一个好问题。
davidcsb

216

也许这会有所帮助:

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

因此,您将数组列表作为String []获得,然后选择任何i,some_array [i]。


10
我了解如何获取阵列资源。但是,这不允许我在xml布局中引用数组中的项。
Jorsher

1
啊对不起 我误解了。好吧,它必须在xml布局中吗?如果标题随用户选择而改变,那么为什么不直接在.java文件中进行更改。例如.setText(some_array [i])。

2
因为,首选项布局在xml中。Java会在菜单中加载首选项中“已启用”的项目。输入17可以检查首选项,然后将其添加到列表视图的后续代码对我来说似乎是多余和草率的。
Jorsher

当我从values文件夹中的xml数组创建arrayadapter时,这很有用
EHarpham 2013年

当获得偏好时需要默认值时,我发现这很有用:String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);其中my_pref先前设置为某个值some_array [x]
Al Lelopath

67

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

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

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


1
@ Benjiko99感谢您发现错误,并相应地进行了更改。
阿米特什2015年

这是最简洁的方法。+1!
suomi35 2015年

1
这似乎更简洁,但是如果有人或翻译者更改了字符串文件中数组的顺序,您将最终使用错误的字符串。
newDeveloper '16

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

这是新的代码:

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

1

另一种方法是在string.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完整。我看到的好处是,更改单个值将影响代码中的所有引用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.