在循環中動態創建多個 Button 並設置 setId(),若在 onClick 中直接用循環變量 id_button 判斷,會因循環結束後變量保留最後值,導致只能響應最後一個按鈕。
for (int i = 0; i < count; i++) {
Button b = new Button(this);
b.setId(id_button); // 假設 id_button 遞增
b.setOnClickListener(this);
id_button++;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case id_button: // ❌ 此處 id_button 為循環結束後的最終值
// 只有最後一個按鈕能進入
break;
}
}
// 循環中設置唯一 ID
for (int i = 0; i < count; i++) {
Button b = new Button(this);
int btnId = View.generateViewId(); // API 17+ 自動生成唯一 ID
b.setId(btnId);
b.setOnClickListener(this);
// 若需映射業務數據,用 SparseArray/Map 保存 id -> data
buttonDataMap.put(btnId, dataList.get(i));
}
@Override
public void onClick(View v) {
int clickedId = v.getId();
// ✅ 直接用點擊 View 的 ID 查找數據
Object data = buttonDataMap.get(clickedId);
if (data != null) {
// 處理業務邏輯
}
}
b.setTag(dataObject); // 直接綁定業務對象
// onClick 中:
Object data = v.getTag();
View.generateViewId() 保證唯一(API <17 用正整數手動管理)。onClick 內只信任 v.getId() 或 v.getTag(),不用外部循環變量。SparseArray、HashMap 或 Tag 映射 ID,解耦 UI 與邏輯。避開 ID 陷阱,動態按鈕事件處理更穩健。