web-dev-qa-db-ja.com

xmlを使用して文字列配列リソース内の文字列を参照する

メニューに表示される項目を有効/無効にできる設定があります。 17個の商品があります。これら17項目のそれぞれのタイトルを使用して、values/array.xmlに文字列配列を作成しました。

私は自分の設定ファイルのためのレイアウトを持つpreferences.xmlを持っています、そして私はタイトルとして使用するために文字列配列から単一の項目を参照したいと思います。

これどうやってするの?

Androidの開発者向けリファレンスでは、XMLを使用して単一の文字列を参照する方法を説明していますが、XMLの配列リソースから文字列を参照する方法はわかりません。

238
Jorsher

一言で言えば:私はあなたができるとは思わないが、回避策があるように思われる:

あなたがここにAndroidリソースを見てみると:

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

(XMLから得られる) "RESOURCE REFERENCE"では、配列セクション(少なくとも文字列配列)の下よりも、個々の項目に対処する方法が指定されていません。あなたの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>

これを使うことで、通常 "@ string/earth"と "@ string/moon"をあなたの "Android:text"と "Android:title" XMLフィールドで使うことができますが、それでも配列を使う能力を失うことはありません。そもそもあなたが意図しているどんな目的のための定義でも。

私のEclipseでここで働いているようです。それがうまくいくかどうかあなたが試してみてくださいなぜですか? :-)

313
davidcesarino

多分これは役立つでしょう:

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

つまり、array-listをString []として取得してから、任意のi、some_array [i]を選択します。

202
user485498

より良い選択肢は、単にリソースとして返された配列を配列として使うことです。

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

これは上記のアプローチの近道のアプローチですが、あなたが望むやり方で仕事をします。それ以外の場合、Androidはxmlベースの配列に対して直接XMLインデックスを提供しません。

61
Amitesh

残念ながら:

  • XMLを使用してvalues/array.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]);  
    }  
}
9
Jorsher

それを行うもう1つの方法は、以下のようにstrings.xmlでresources配列を定義することです。

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

DRYをそのままにして、同じ文字列を他のxmlに参照することもできます。私が見ている利点は、単一の値を変更するだけでコード内のすべての参照に影響があることです。

0
Amruta-Pani