0

このようにXMLファイルリソースを読み込んでいますが、

getResources().getXml(R.xml.fiel1); 

ここでのシナリオは、要因によっては、選択できる多数の xml ファイルが存在する可能性があるということです。それ、どうやったら出来るの?この場合、ファイル名はすべてファイルで始まり、ファイル 1、ファイル 2、ファイル 3 などの異なる番号で終わるという点で似ています。そのため、ファイル名を使用して文字列変数を形成し、必要に応じて接尾辞を追加するだけで済みます。 file1 (file+1) のようなファイル名。問題は、ファイル名変数をメソッドに渡そうとしても、さまざまなエラー (NullPointerEx、ResourceId Not found など) が発生し続けることです。これを達成する正しい方法は何ですか?

4

3 に答える 3

5

getIdentifier()を使用できますが、ドキュメントには次のように記載されています。

この機能の使用はお勧めできません。名前でリソースを取得するよりも、識別子でリソースを取得する方がはるかに効率的です。

そのため、xml ファイルを参照する配列を使用することをお勧めします。整数配列リソースとして宣言できます。例res/values/arrays.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer-array name="xml_files">
        <item>@xml/file1</item>
        <item>@xml/file2</item>
        etc...
    </integer-array>
</resources>

そしてJavaで:

private XmlResourceParser getXmlByIndex(int index) {
    Resources res = getResources();
    return res.getXml(res.getIntArray(R.array.xml_files)[index - 1]);
}

もちろん、新しい xml ファイルを追加するたびに配列を更新する必要があります。

于 2011-04-11T19:43:41.350 に答える
3

Resources のgetIdentifierメソッドを使用して ID を見つけることができます。

Resources res = getResources();
for(/* loop */) {
    int id = res.getIdentifier("file" + i, "xml", "my.package.name");
    res.getXml(id);
}
于 2011-04-11T19:11:01.160 に答える
2

getIdentifierリソースの数がコンパイル時に固定されていると仮定すると、提案に代わる方法は、識別子とリソースの間に静的なマッピングを作成することです。

たとえば、接尾辞付きの数値 ID を使用できます。

class Whatever {
    static final int[] resources = new int[] {
        R.xml.file1, R.xml.file2, R.xml.file3
    }
}

これにより、単純なインデックス操作でリソースを取得できます。

getResources().getXml(resources[i]);

または、よりわかりやすいマッピングが必要な場合は、Java の にMap基づくクラスのいずれかを使用できます。

class Whatever {
    static final Map<String, Integer> resources = new HashMap<String, Integer>();

    static {
        resources.put("file1", R.xml.file1);
        resources.put("file2", R.xml.file2);
        resources.put("file3", R.xml.file3);
        resources.put("something_else", R.xml.something_else);
    }
}

これを使用すると、get(String)その名前で値を取得できます。

于 2011-04-11T19:51:19.467 に答える