8

私はAndroidプロジェクトに取り組んでおり、たくさんのドローアブルを持っています。これらのドローアブルはすべてicon_0.pngicon_1.png...のように名前が付けられていますicon_100.png。これらのドローアブルのすべてのリソースIDを整数のArrayListに追加したいと思います。(Androidを知らない人のために、Javaだけ、私は静的変数について話している、のようなクラスの静的内部クラスでR.drawable.icon_0。この静的変数はすべて整数です。)

それらを1つずつ追加するよりも、これを行うためのより効率的な方法はありますか?好き

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(R.drawable.icon_1);
list.add(R.drawable.icon_2);
...
list.add(R.drawable.icon_100);

どういうわけかそれらをループできますか?好き

for(int i=0; i<100; i++)
{
    list.add(R.drawable.icon_+i);  //<--- I know this doesn't work.
}

これらの静的整数が存在するファイルを制御できず、実行時にドローアブルを作成できません。

どんな助けでもいただければ幸いです!

編集

答えを読みましたが、大きな問題が1つContextあります。この配列/ IDのリストを作成する必要があるインスタンスにアクセスできないため(静的初期化ブロックで作成します)、getResources()方法、答えの2つが提案したものは機能しません。これを行う他の方法はありますか?

4

4 に答える 4

4

valuesディレクトリ内のフォルダにXMLファイルを作成しますresource

<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="myIcons">
    <item>@drawable/icon1</item>
    <item>@drawable/icon2</item>
    <item>@drawable/icon3</item>
    <item>@drawable/icon4</item>
    <item>@drawable/icon5</item>
    ...
    ...
</array>
</resources>

次のコードを実行すると、アイデアが得られます。

Resources res = getResources();
TypedArray myIcons= res.obtainTypedArray(R.array.myIcons);  //mentioned  in the XML
for(int i=0; i<100; i++)
{
    Drawable drawable = myIcons.getDrawable(i);
    list.add(drawable);  
}
于 2012-08-05T07:08:30.590 に答える
3

あなたはこれを試すことができます。YourClassName.class.getFields();

Field[] fields = R.drawable.class.getFields();

すべてのフィールドを反復処理できます。必要以上のフィールドがある場合は、フィルター処理が必要になる場合があります。

于 2012-08-05T06:49:42.697 に答える
0

1つの方法は、リフレクションAPIを使用することです。

線に沿って何か...

Field[] fields =  R.drawable.class.getFields();
List<String> names = new ArrayList<String>(); 
for (Field field : fields) {
    if(field.getName().startsWith("icon")) 
       names.add(field.getName());    
}

int resid = getResources().getIdentifier(names.get(0), "drawable", "com.org.bla");

私はこれをテストしていませんが、あなたはその考えを理解しています。

于 2012-08-05T06:52:20.300 に答える
0

これが私がやったことです:

icons = new ArrayList<Integer>(100);

//get all the fields of the R.drawable class.       
Field  [] fields = R.drawable.class.getDeclaredFields();

//create a temporary list for the names of the needed variables.
ArrayList <String> names = new ArrayList<String>(100);

//select only the desired names.
for(int i=0; i<fields.length; i++)
    if(fields[i].getName().contains("icon_"))
        names.add(fields[i].getName());

//sort these names, because later i want to access them like icons.get(0)
//what means i want icon_0.
Collections.sort(names);

try
{
    for(int i=0; i<names.size(); i++)
    {
        //get the actual value of these fields, 
        //and adding them to the icons list.
        int id = R.drawable.class.getField(names.get(i)).getInt(null);
        icons.add(id);
    }
}
catch(Exception ex)
{
    System.out.println(ex.getMessage());
}

確かに、これは最速の方法ではありませんが、機能しています。彼の答えが私をこの解決策に導いたので、私はAljoshaBreの解決策を受け入れます。

みんな助けてくれてありがとう!

于 2012-08-05T10:27:08.970 に答える