2012-07-07 33 views
16

Giả sử tôi đã lưu trữ mảng 2 chiều trong tài nguyên Android như được hiển thị bên dưới. Làm thế nào tôi có thể nhận được chúng trong một bộ sưu tập java như Arraylist?Làm thế nào để lấy mảng 2D từ tài nguyên chuỗi xml cho Android?

<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> 

Ví dụ trong trường hợp của 1 mảng chiều chúng ta có thể làm điều đó bằng

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

Khi countries_array là như

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

Trả lời

36

Yếu tố <string-array> của một tập tin nguồn lực chỉ có thể được sử dụng cho mảng thứ nguyên duy nhất. Nói cách khác, mọi thứ giữa <item></item> được coi là một chuỗi.

Nếu bạn muốn lưu trữ dữ liệu theo cách bạn mô tả (một cách hiệu quả pseudo-XML), bạn sẽ cần phải nhận được các mặt hàng như một đơn String[] sử dụng getStringArray(...) và phân tích các <name><codes> yếu tố chính mình.

Cá nhân tôi có thể muốn đi với một định dạng de hạn như ...

<item>Bahrain,12345</item> 

... sau đó chỉ cần sử dụng split(...).

Ngoài ra, xác định mỗi <item> như một JSONObject như ...

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

Tốt câu trả lời. Nhưng có một điều quan trọng nếu có một khoảng trống trong json, điều quan trọng là thay thế '''' bằng char đặc biệt '{" title ":" WHITE   SHOW "}'. Nếu không, không có gì sẽ được hiển thị. tính năng của nó là JSON –

5

Thay vì mục đa giá trị, tôi wrote about another cách tiếp cận, nơi bạn có thể lưu trữ đối tượng phức tạp của bạn như là một mảng, sau đó hậu tố tên với số nguyên gia tăng. Lặp lại chúng và tạo ra một danh sách các đối tượng được gõ mạnh từ đó nếu cần thiết.

<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> 

Sau đó, bạn có thể tạo ra một phương pháp tĩnh để lấy chúng:

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

Nó có thể được tiêu thụ như thế này bây giờ:

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

Vòng lặp for ném một lỗi tại dòng getString. Tài nguyên mong muốn của kiểu có thể tạo kiểu. – Nilpo

+0

@Nilpo Thêm '@SuppressWarnings (" ResourceType ")' vào phương thức đóng gói hoặc lớp giải quyết vấn đề này. (Điều này chỉ có thể xảy ra trong các phiên bản Android Studio mới hơn.) – Nilpo

Các vấn đề liên quan