XMLを使用した文字列配列リソース内の文字列の参照


256

メニューに表示される項目を有効/無効にできる設定があります。17アイテムあります。values / arrays.xmlに、これらの17項目のそれぞれのタイトルを含む文字列配列を作成しました。

設定ファイルのレイアウトが含まれるpreferences.xmlがあり、文字列配列から単一の項目を参照してタイトルとして使用したいと思います。

これどうやってするの?

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

回答:


331

要するに:私はあなたができると思いますが、回避策があるように思われません:

ここでAndroidリソースを調べた場合:

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

配列セクション(少なくとも文字列配列)の下にあるように、(XMLから取得した) "リソース参照"は個々の項目をアドレス指定する方法を指定していません。XMLで「@ array / yourarrayhere」を使用することもできます。設計時に最初のアイテムを取得することを知っています。しかし、使用したい場合、それは実用的ではありません。たとえば、... 2番目です。

しかし、あなたができるトリックがあります。こちらをご覧ください:

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でここで動作するようです。うまくいくか試してみませんか?:-)


32
name<item> s ... * sigh *にのみタグを付けることができる場合
一部のNoob学生

2
試してみただけ!デフォルトで配列を定義しましたが、定義strings.xmlしませんでしたがvalues-fr、配列はフランス語バージョンで更新されました。間違っている..しかし、クールに動作します!
Blundell 2012年

1
誰にでも簡単なヒント:「地球」をダブルクリックすると地球が強調表示されます。@ string / moonで月をダブルクリックすると、月だけが強調表示されます。したがって、配列を作成するときに最初の項目を数回複製すると、個々の文字列と文字列配列の間でかなり簡単にコピーして貼り付けることができます。文字列配列の作成をスピードアップするのに役立つかもしれません:)
ArtOfWarfare

2
このアプローチがパフォーマンスを低下させるのは、配列で文字列を宣言しているのに参照を使用していない場合よりも知りたいだけですか?
Alex Bonel 2013

1
@AlexBonelは興味深い質問です。正直なところ、わかりません。たとえそうであっても、この種の非常に微細な最適化はコンパイラーに任せるべきだと思います。とにかく、彼らは道のどこかにインラインで終了しませんか?彼らはそうだと思いますが、よくわかりません。少なくともAndroidチェーンの上位レベルでは、apktoolを使用してAPKを完全に分解でき、文字列キーの元の名前が復元されます。つまり、上記のような参照された宣言が保持されます。でも今はあまり興味がないので、お答えできません。それは良い質問です。
davidcsb 2013

216

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

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

したがって、配列リストをString []として取得し、任意のi、some_array [i]を選択します。


10
配列リソースを取得する方法を理解しています。ただし、XMLレイアウトの配列から項目を参照することはできません。
Jorsher、2010年

1
あ、ごめんなさい。誤解しました。さて、それはxmlレイアウトでなければなりませんか?ユーザーの選択によってタイトルが変わる場合は、.javaファイルで変更しないでください。例:.setText(some_array [i])。

2
なぜなら、設定レイアウトはxmlにあるからです。Javaは、設定で「有効」になっている項目をメニューにロードします。設定を確認するために17と入力すると、それをリストビューに追加するための後続のコードは冗長で、ずさんに思えます。
Jorsher、2010年

これは、valuesフォルダのxml配列からarrayadapterを作成するときに便利でした
EHarpham

これは、設定を取得するときにデフォルト値が必要な場合に便利ですString myPref = preferences.getString(context.getResources().getString(R.string.my_pref), some_array [0]);。my_prefは以前に何らかの値に設定されていますsome_array [x]
Al Lelopath

67

より良いオプションは、リソースとして返された配列を配列として使用することです:

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

これは上記のアプローチのショートカットアプローチですが、希望する方法で機能します。それ以外の場合、androidはxmlベースの配列に直接XMLインデックスを提供しません。


1
@ Benjiko99エラーを見つけてくれてありがとう、それに応じて変更しました。
Amitesh

これは、最も簡潔な方法です。+1!
suomi35

1
これはより簡潔に見えるかもしれませんが、誰かまたはトランスレータが文字列ファイル内の配列の順序を変更すると、誤った文字列が使用されることになります。
newDeveloper 2016年

9

残念ながら:

  • 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]);  
    }  
}

1

それを行う別の方法は、以下のように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はそのまま残ります。私が見る利点は、1つの値を変更するだけで、コード内のすべての参照に影響することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.