在 Android 開發中,若以程式碼動態建立多個 TextView 並指派同一個 OnClickListener,卻發現 view.getId() 回傳皆為 -1,這通常是因為未為動態產生的 View 明確設定 ID。
XML 布局中透過 android:id="@+id/xxx" 會自動生成唯一整數 ID,但程式碼中 new TextView(context) 預設 ID 為 View.NO_ID (-1)。若不手動呼叫 setId(),所有動態 View 共用同一個 -1,自然無法分辨身分。
View.generateViewId(): 系統保證不重複,簡單可靠。
textView.setId(View.generateViewId());
AtomicInteger 遞增分配,避免衝突。
private static final AtomicInteger sNextId = new AtomicInteger(1);
textView.setId(sNextId.getAndIncrement());
setTag(Object) 更靈活,可直接存放資料物件或位置索引。
textView.setTag(position);
textView.setOnClickListener(v -> {
int pos = (int) v.getTag();
// 處理業務邏輯
});
推薦採用 方案 3(Tag 機制),解耦 View 身分與業務邏輯,程式碼更易維護。若確實需要 View 真實 ID(如測試框架需求),再搭配 generateViewId() 使用。