2012-07-07 118 views
16

假设我已经在android资源中存储了一个2维数组,如下所示。我怎样才能让他们像Arraylist这样的java集合?如何从Android的xml字符串资源检索二维数组?

<resources> 
<string-array name="countries_array"> 
<item> 
    <name>Bahrain</name> 
    <code>12345</code> 
</item> 
<item> 
    <name>Bangladesh</name> 
    <code>54545</code> 
    </item> 
<item> 
    <name>India</name> 
    <code>54455</code> 
</item> 

</string-array> 
</resources> 

例如,在1个维阵列,我们可以做到这一点的情况下,使用

getResources().getStringArray(R.array.countries_array); 

当countries_array就像

<resources> 
<string-array name="countries_array"> 
    <item>Bahrain</item> 
    <item>Bangladesh</item> 
    <item>India</item> 
</string-array> 
</resources> 

回答

36

只能用于一个资源文件的<string-array>元件对于单维数组。换句话说,<item></item>之间的所有内容都被认为是单个字符串。

如果你想存储在你描述(有效伪XML)数据的方式,你需要使用getStringArray(...)获得项目作为单个String[]和自己解析<name><codes>元素。

个人而言,我想可能与反限制的格式,如去...

<item>Bahrain,12345</item> 

...那么就使用split(...)

另外,定义每个<item>作为一个JSONObject如...

<item>{"name":"Bahrain","code":"12345"}</item> 
+0

很好的回答。但是有一件重要的事情是,如果json中有一个空格,用特殊字符替换''''是非常重要的,例如'{“title”:“WHOLED   SHOW”}''。否则什么都不会显示。它更多的是JSON的功能 – 2016-02-08 12:14:29

5

而是多值项,我wrote about another方法,您可以存储您的复杂的对象作为一个数组,然后用后缀名一个增量整数。循环遍历它们,并根据需要从那里创建一个强类型对象列表。

<resources> 
    <array name="categories_0"> 
     <item>1</item> 
     <item>Food</item> 
    </array> 
    <array name="categories_1"> 
     <item>2</item> 
     <item>Health</item> 
    </array> 
    <array name="categories_2"> 
     <item>3</item> 
     <item>Garden</item> 
    </array> 
<resources> 

然后您可以创建一个静态方法来检索它们:

public class ResourceHelper { 

    public static List<TypedArray> getMultiTypedArray(Context context, String key) { 
     List<TypedArray> array = new ArrayList<>(); 

     try { 
      Class<R.array> res = R.array.class; 
      Field field; 
      int counter = 0; 

      do { 
       field = res.getField(key + "_" + counter); 
       array.add(context.getResources().obtainTypedArray(field.getInt(null))); 
       counter++; 
      } while (field != null); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      return array; 
     } 
    } 
} 

,它可以像现在这样消耗:

for (TypedArray item : ResourceHelper.getMultiTypedArray(this, "categories")) { 
    Category category = new Category(); 
    category.ID = item.getInt(0, 0); 
    category.title = item.getString(1); 
    mCategories.add(category); 
} 
+0

for循环在getString行引发错误。预期资源类型styleable。 – Nilpo 2016-04-19 08:20:13

+0

@Nilpo向封装方法或类添加'@SuppressWarnings(“ResourceType”)'解决了这个问题。 (这可能只发生在新版Android Studio中。) – Nilpo 2016-04-19 08:27:42