カードゲーム用の Android アプリケーションを作成しています。基本的に、私はそれを持っているので、一度に画面に 3 枚のカードが 4 列あり、各カードは押せる で表されますImageButton
。私の問題は、これらの 12 枚のカードを作成できるように for ループを使用したいOnClickListeners
一方で、現在のカードの番号を追跡して、どのボタンが押されたかを適切に追跡できるようにすることです。以下のコードでは、counter を使用して、プッシュされたカードの数pressed_index
と、プッシュされた 3 枚のカードを追跡しています。カウンターが 3 に等しくない場合は、上のカラー フィルターを変更して、ImageButton
押したように見せます。ただし、匿名クラスを設定すると、匿名クラスでは許可されていないため、 x 変数を使用できません。設定できるようにする必要がありますpressed_index
そうしないと、12 枚のカードのうちどれがプッシュされているかを知る方法がありません。
ImageButton[] hand = new ImageButton[12];
int[] pressed_index = new int[3];
int counter = 0;
for (int x = 0; x < 12; x++) {
hand[x] = (ImageButton)findViewById(R.id.//card_1, card_2, etc.);
hand[x].setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
pressed_index[counter] = x;
counter++;
if (counter != 3) {
((ImageView) v).setColorFilter(Color.argb(150, 155, 155, 155));
}
}
});
}
別の方法は、私が今それを持っている方法であり、それ以外の方法でそれを行うことができる唯一の方法は、12のメソッドすべてをハードコードし、物理的に各番号を入れることです. ただし、これは非常に非効率的であり、コードの更新が非常に困難になります。ID を正しく設定する問題は悪くありません。x から構築された文字列から ID を取得するだけです。
int ID = getResources().getIdentifier(("card_"+(x+1)),"id","com.example.project");
hand[x] = (ImageButton)findViewById(ID);
...ここにある解決策に似ています: Android: 文字列 / ループで findViewById() を使用し
ます。Accessing variables from onclicklistenerやAndroid: Accessing a global Variable inside an onClickListener のような投稿を通じて、変数のみfinal
を渡すことができるようです。一般的な修正の 1 つは、匿名クラスを使用する代わりに別のクラスを作成することです。の別のクラスを書き始めたとき、変数を渡して を作成し、それを正しいカードに一致させるOnClickListener
ことができなかったため、同じ問題に遭遇しました。OnClickListener
これを修正する方法について何かアイデアがあれば教えてください。