我正在爲紙牌遊戲創建Android應用程序。基本上,我擁有它,所以屏幕上一次有四行三張卡片,每張卡片由可壓縮的ImageButton
表示。我的問題是我想使用for循環,所以我可以爲這12張卡片創建OnClickListeners
,同時有一種方法可以跟蹤我們所在的數字卡片的位置,以便我可以正確跟蹤哪個按鈕被按下。在下面的代碼中,我使用計數器來跟蹤有多少卡被推入,並使用pressed_index
來跟蹤被推入的三張卡。如果計數器不等於三,我更改ImageButton
上的顏色過濾器使其看起來被推動。但是,當我設置匿名類時,我不能使用x變量,因爲它在匿名類中是不允許的。我需要能夠將pressed_index
設置爲當前卡的值,否則我無法知道12張卡中的哪一張被推入。在Android OnClickListener匿名類中使用循環索引創建ImageButton的網格
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));
}
}
});
}
另一種選擇,這是我怎麼會有現在,我可以認爲否則這樣做的唯一方法是硬編碼所有十二個方法,並在每個數字物理推杆。儘管這樣做效率很低,並且很難更新代碼。正確設置ID的問題是不壞,我只是從X構造,像這樣的字符串獲得ID ...
int ID = getResources().getIdentifier(("card_"+(x+1)),"id","com.example.project");
hand[x] = (ImageButton)findViewById(ID);
......類似的解決方案在這裏找到:Android: Using findViewById() with a string/in a loop 然而,即使在經過大量研究之後,使用x的問題仍然無法解決。通過Accessing variables from onclicklistener和Android: Accessing a global Variable inside an onClickListener這樣的帖子,似乎只有final
變量可以被傳遞,而一個常見的問題是創建一個單獨的類而不是使用匿名類。然而,這並沒有讓我走得很遠,因爲當我開始爲OnClickListener
編寫單獨的課程時,我遇到了同樣的問題,因爲我無法傳遞變量來創建OnClickListener
以將其匹配到正確的卡。請讓我知道,如果你有任何想法可以解決這個問題。
順便說一句,雖然這並不關心的問題本身 - 價值'12'應該出來,形成一個變量/不斷在這裏;否則它只是一個[幻數](https://en.wikipedia.org/wiki/Magic_number_(編程)#Unnamed_numerical_constants) – vaxquis