2010-12-01 8 views
40

配列の配列、特に文字列を含むリソースデータ構造を実装しようとしています。私が実行する問題は、サブ配列オブジェクトとその特定の値を取得する方法です。ここでAndroidリソース - 配列の配列

<resources> 
    <array name="array0"> 
    <item> 
     <string-array name="array01"> 
     <item name="id">1</item> 
     <item name="title">item one</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array02"> 
     <item name="id">2</item> 
     <item name="title">item two</item> 
     </string-array> 
    </item> 
    <item> 
     <string-array name="array03"> 
     <item name="id">3</item> 
     <item name="title">item three</item> 
     </string-array> 
    </item> 
    </array> 
</resources> 

が....私のリソースファイルは、次のようになりますし、私のJavaコードで、私は配列を取得し、この時そう...

TypedArray typedArray = getResources().obtainTypedArray(R.array.array0); 

TypedValue typedValue = null; 

typedArray.getValue(0, typedValue); 

のようなサブ要素にアクセスしようtypedArrayオブジェクトは文字列配列 "array01"を表すはずですが、 "id"と "title"文字列要素を取得する方法はわかりません。どのような助けもありがとうございます、事前に感謝します。

+0

Andi Kruschによって指摘されているように、私がXMLで使用した「名前」属性には巻き込まれないようにしてください。彼らは私の質問を理解しやすくするためにそこにいるだけです。 (私は思った):-) – JediPotPie

+0

うわー!私はこれが誰かのための簡単なものだと思った。それで、コミュニティはそれができないと言っていますか? – JediPotPie

答えて

111

あなたはほとんど何でもできます。各配列を別々に宣言してから、配列の配列を宣言しなければなりません。このような何か:確かサブアレイを作る

<integer-array name="id_array"> 
    <item>1</item> 
    <item>2</item> 
    <item>3</item> 
</integer-array> 
<string-array name="name_array"> 
    <item>name 1</item> 
    <item>name 2</item> 
    <item>name 3</item> 
</string-array> 
<array name="array0"> 
    <item>@array/id_array</item> 
    <item>@array/name_array</item> 
</array> 

Resources res = getResources(); 
TypedArray ta = res.obtainTypedArray(R.array.array0); 
int n = ta.length(); 
String[][] array = new String[n][]; 
for (int i = 0; i < n; ++i) { 
    int id = ta.getResourceId(i, 0); 
    if (id > 0) { 
     array[i] = res.getStringArray(id); 
    } else { 
     // something wrong with the XML 
    } 
} 
ta.recycle(); // Important! 
+0

すごいヒント!!!! –

+0

配列の要素を取得できません。あなたはいくつかの解決策を教えてください。 – user

+0

@Trupti - どうしてですか?この回答がうまくいかない場合は、何をしようとしているのかを示す質問を投稿し、何がうまくいかないのかを説明してください。 –

-3

アレイは名前と値のペアではありません。あなたは番号で要素にアクセスすることができます。 xmlの構文が間違っています。そのようにする必要があります:

<string-array name="string_array_name"> 
    <item>text_string1</item> 
    <item>text_string2</item> 
</string-array> 
+0

厳密に言えば、XMLの構文は間違っていません。私はそれらの名前を私の質問のために人間が読めるようにしました。あなたは私の質問を誤解した。問題は、typedArrayオブジェクトからサブ配列の要素にアクセスするにはどうすればいいですか? – JediPotPie

0

@TedのHoppの答え​​に応じて、よりエレガントな方法:

<string-array name="array01"> 
    <item name="id">1</item> 
    <item name="title">item one</item> 
</string-array> 
<!-- etc. --> 
<array name="array0"> 
    <item>@array/array01</item> 
    <!-- etc. --> 
</array> 

は、次に、あなたのコードの中で、あなたがこのような何かを行数は同じです。
配列セルにアクセスするコードを書くのが楽しいです!
TypedArray "array0"の醜い "item"タグを維持しながら、アンドロイドはまだ子供です。私の意見では
、最も柔軟性があるべき:

<array name="array0"> 
    <integer-array name="id_array"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </integer-array> 
    <string-array name="name_array"> 
     <item>name 1</item> 
     <item>name 2</item> 
     <item>name 3</item> 
    </string-array> 
</array> 

それは、Android方法ではないので、それをしないでください:)

+1

サブアレイの行数が同じである必要はありません。 Android(および一般的なJava)は問題なく[jagged(a.k.a.aggged)配列](https://en.wikipedia.org/wiki/Jagged_array)をサポートしています。このような配列を反復処理するときは、ループインデックスに適切な注意を払うだけです。 –

0

https://developer.android.com/guide/topics/resources/more-resources.html#Color

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <array name="icons"> 
     <item>@drawable/home</item> 
     <item>@drawable/settings</item> 
     <item>@drawable/logout</item> 
    </array> 
    <array name="colors"> 
     <item>#FFFF0000</item> 
     <item>#FF00FF00</item> 
     <item>#FF0000FF</item> 
    </array> 
</resources> 

このアプリケーションコードは、それぞれの配列を取得します各アレイの最初のエントリを取得します。

Resources res = getResources(); 
TypedArray icons = res.obtainTypedArray(R.array.icons); 
Drawable drawable = icons.getDrawable(0); 
TypedArray colors = res.obtainTypedArray(R.array.colors); 
int color = colors.getColor(0,0);