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

Jor*_*her 246 xml arrays android reference preferences

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

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

我怎样才能做到这一点?

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

dav*_*ino 318

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

如果您在这里查看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>
Run Code Online (Sandbox Code Playgroud)

通过使用它,你可以在你的"android:text"和"android:title"XML字段中正常使用"@ string/earth"和"@ string/moon",但你不会失去使用数组的能力为了你想要的目的定义.

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

  • 如果我们只能给"item"标签提供`name`标签...*叹气* (31认同)
  • 试过了!在默认的`strings.xml`中定义了数组,但是没有在`values-fr`中,并且数组仍然使用法语版本更新.这么错......但很酷很有效! (2认同)
  • 只是想知道这种方法是否会导致比我在数组中声明字符串更糟糕但不使用引用? (2认同)

小智 210

也许这会有所帮助:

String[] some_array = getResources().getStringArray(R.array.your_string_array)
Run Code Online (Sandbox Code Playgroud)

所以你将array-list作为String []然后选择任何i,some_array [i].

  • 我理解如何获取阵列资源.这不允许我在xml布局中引用数组中的项目. (9认同)
  • 因为,首选项布局是xml.java加载菜单中包含首选项中"已启用"的项目.键入17个检查首选项,后续代码将其添加到列表视图对我来说似乎是多余的和草率的. (2认同)

Ami*_*esh 63

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

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

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

  • 这可能看起来更简洁,但如果有人或翻译者更改了字符串文件中数组的顺序,您最终将使用错误的字符串。 (2认同)

Jor*_*her 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]);  
    }  
} 
Run Code Online (Sandbox Code Playgroud)

我做了什么:

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

  • 为了遍历首选项,我只是将键命名为key1,key2,key3等.由于您使用字符串引用键,您可以选择在运行时"构建"键名.

这是新代码:

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