循環動態創建多個 ImageButton 添加到 LinearLayout,但 getId() 均返回 -1,導致無法在統一的 OnClickListener 中區分是哪個按鈕被點擊。
為每個按鈕設置唯一標識(如索引、數據對象),點擊時通過 v.getTag() 獲取。
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
Object tag = v.getTag();
if (tag instanceof Integer) {
int index = (Integer) tag;
// 根據 index 處理業務邏輯
Log.d("TAG", "Clicked button index: " + index);
}
}
};
for (int i = 0; i < images.length; i++) {
ImageButton ib = new ImageButton(this);
ib.setImageDrawable(resizeImage(getResId(images[i])));
ib.setTag(i); // 關鍵:設置唯一標識
ib.setOnClickListener(listener);
container.addView(ib);
}
若按鈕對應複雜數據,可直接存入模型對象:
ib.setTag(imageDataList.get(i)); // 存入 Bean
// 點擊時
ImageData data = (ImageData) v.getTag();
handleImageClick(data);
setTag 更輕量靈活。View.generateViewId() (API 17+) 生成唯一 ID。tag != null 防止空指針。善用 setTag/getTag,輕鬆解決動態 View 點擊識別難題,代碼更清晰。