2

私はアンドロイドアプリを書いていて、ネストされたループでボタンのグリッドを初期化しようとしています.

私はもともと研究を通じてこの現在の解決策を見つけましたが、何がうまくいかないのかわかりません。

for (int i = 0; i < piles.length; i++)
  for (int j = 0; j < piles[0].length; j++) {

        id = getResources().getIdentifier("R.id." + "b" + numplayaz + Integer.toString(i) + Integer.toString(j), "id","app.dj");
        bpiles[i][j] = ((Button) this.findViewById(id));
        bpiles[i][j].setOnClickListener(this);
   }
 }

何らかの理由で id が常に 0 に設定されているため、bpiles[0][0] が null に設定されている場合、null ポインター例外が発生します。

私は小さな解決策をたくさん試しましたが、何もうまくいきませんでした。

誰かが私の問題が何であるかを理解しているか、これに対するより良い解決策を持っていますか?

ああ、私はこの投稿を見たときにこれを思いつきました。 バリアント文字列を含む Android findViewbyId

4

3 に答える 3

3

の最初のパラメーターgetIdentifier()が間違っているようです:

id = getResources().getIdentifier("R.id." + "b" + numplayaz + Integer.toString(i) + Integer.toString(j), "id","app.dj");
//             Do not use "R.id." ^^^^^^^

参照しようとしていることは既にわかってRおり、2 番目のパラメーターで type を指定しています"id"。それも変更してください:

id = getResources().getIdentifier("b" + numplayaz + Integer.toString(i) + Integer.toString(j), "id", "app.dj");

また、文字列の+演算子が優先されるため、"b" + numplayaz + i + j. しかし、StringBuilder は最速のアプローチであり、読みやすいかもしれません。

于 2012-11-24T21:21:58.927 に答える
0

ドローアブル名を作成したら、この関数を使用してIDを取得できます。

public static int getDrawableByName( String name ) {
    int drawableId = 0;

    try {
         Class res = R.drawable.class;
         Field field = res.getField( name );
         drawableId = field.getInt(null);
    }
    catch (Exception e) {
        e.printStackTrace();
    }

    return drawableId;
}
于 2012-11-24T20:01:02.987 に答える
0

0 は、ID が見つからないことを意味します。

  1. 参照しているすべての ID が存在することを確認しましたか?

  2. 「app.dj」の代わりに getPackageName() を使用します。多分それは不完全です。

于 2012-11-24T19:58:23.373 に答える