【问题标题】:Referencing a string in a string array resource with xml使用 xml 引用字符串数组资源中的字符串
【发布时间】:2011-05-08 20:33:33
【问题描述】:

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

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

我该怎么做?

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

【问题讨论】:

    标签: android xml reference preferences arrays


    【解决方案1】:

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

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

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

    您会在数组部分(至少是字符串数组)下看到“资源引用”(从 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 上工作。你为什么不试着告诉我们它是否有效? :-)

    【讨论】:

    • 如果我们只能给 s...*sigh* 提供name 标签
    • 刚刚试了!在默认的strings.xml 中定义了数组,但在values-fr 中没有定义数组,并且该数组仍然使用法语版本进行了更新。错了..但很酷,它有效!
    • 给任何人的快速提示:双击“地球”将突出显示地球。双击 @string/moon 中的月亮将突出显示月亮。因此,如果在构建数组时多次复制第一项,则可以相当轻松地在各个字符串和字符串数组之间复制和粘贴。可能有助于加快创建字符串数组 :)
    • 只是想知道这种方法是否会比我在数组中声明字符串但不使用引用导致性能更差?
    • @AlexBonel 一个有趣的问题,老实说我不知道​​。即使会,我认为我们应该将这种非常微的优化留给编译器。无论如何,他们不是在路上的某个地方结束内联吗?我猜他们会,但我不确定。至少在 Android 链的更高级别上,我知道您可以使用 apktool 完全反汇编一个 APK,它会恢复字符串键的原始名称,这意味着引用的声明,如上面的声明,将被保留。但是我现在对那个领域不是很感兴趣,所以我不能回答你的问题。不过,这是个好问题。
    【解决方案2】:

    也许这会有所帮助:

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

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

    【讨论】:

    • 我了解如何获取数组资源。但是,这不允许我在 xml 布局中引用数组中的项目。
    • 啊,对不起。我误解了。那么,它必须在 xml 布局中吗?如果标题随用户选择而变化,为什么不在 .java 文件中进行。例如。 .setText(some_array[i]).
    • 因为首选项布局是在 xml 中。 java加载带有在首选项中“启用”的项目的菜单。输入 17 项检查首选项,随后将其添加到列表视图的代码对我来说似乎是多余和草率的。
    • 这在我从我的 values 文件夹中的 xml 数组创建数组适配器时很有用
    • 我发现这在获取首选项时需要默认值时很有用:String myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]); 其中 my_pref 之前设置为某个值 some_array[x]
    【解决方案3】:

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

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

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

    【讨论】:

    • @Benjiko99 感谢您发现错误,已相应更改。
    • 这是最简洁的方法。 +1!
    • 这可能看起来更简洁,但如果有人或翻译人员更改了字符串文件中数组的顺序,您最终会使用错误的字符串。
    【解决方案4】:

    不幸的是:

    • 您似乎无法使用 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]);  
        }  
    }
    

    【讨论】:

      【解决方案5】:

      另一种方法是在 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 不变。 我看到的优点是,通过单个值更改,它会影响代码中的所有引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-05
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        相关资源
        最近更新 更多