用xml引用string数组资源中的string

我有喜好,你可以启用/禁用哪些项目将出现在菜单上。 有17个项目。 我在values / arrays.xml中创build了一个string数组,其中包含这17个项目中的每一个的标题。

我有我的首选项文件的布局的preferences.xml,我想引用string数组中的单个项目作为标题。

我怎样才能做到这一点?

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

总之: 我不认为你可以,但似乎有一个解决方法:

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

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

您看到的不是数组部分(至less是string数组),“RESOURCE REFERENCE”(从XML获得)没有指定解决单个项目的方法。 你甚至可以尝试在你的XML中使用“@ array / yourarrayhere”。 我知道在devise时你会得到第一个项目。 但是,如果你想使用,那么这是没有实际用途的,当然,我们说…第二。

但是,有一个你可以做的伎俩。 看这里:

在XML Array中引用XMLstring(Android)

你可以通过寻址独立的string来“欺骗”(而不是真正的)数组定义。 例如,在你的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上工作。 你为什么不尝试告诉我们它是否有效? 🙂

也许这会有所帮助:

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

所以你得到的数组列表作为一个String [],然后select任何我,some_array [我]。

更好的select是将资源返回数组作为数组使用,意思是:

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

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

不幸:

  • 看来你不能用XML来在values / arrays.xml中引用数组中的单个项目。 当然你可以用Java,但不能用XML。 在Android开发人员参考中没有关于这样做的信息,而且我在其他任何地方都找不到。

  • 看来你不能在首选项布局中使用数组作为键。 每个密钥必须是具有自己密钥名称的单个值。

我想完成的工作:我想能够遍历17个首选项,检查是否检查项目,如果是,从string数组中加载该首选项名称的string。

这是我希望完成这个任务的代码:

 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]); } } 

我做了什么:

  • 我为每个项目设置了一个单独的string,并引用了单个string。 我使用首选布局checkbox标题的单个string引用,以及我的循环的数组。

  • 为了遍历首选项,我只是命名了诸如key1,key2,key3之类的关键字。既然你用一个string引用了一个关键字,你可以select在运行时“build立”关键字名称。

这是新的代码:

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

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

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

您也可以将相同的string引用到其他xml中,并保持DRY不变。 我看到的好处是,只要改变一个值就会影响代码中的所有引用。