首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 動態新增 TextView 監聽器,取得 ID 卻全是 -1 怎麼辦?

     編輯:程式設計綜合問答

在 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,自然無法分辨身分。

解決方案

  1. API 17+ 使用 View.generateViewId(): 系統保證不重複,簡單可靠。
    textView.setId(View.generateViewId());
  2. 舊版 API 自行管理 ID 池: 定義一個 AtomicInteger 遞增分配,避免衝突。
    private static final AtomicInteger sNextId = new AtomicInteger(1);
    textView.setId(sNextId.getAndIncrement());
  3. 利用 Tag 傳遞業務資料: 若只需在監聽器中識別項目,setTag(Object) 更靈活,可直接存放資料物件或位置索引。
    textView.setTag(position);
    textView.setOnClickListener(v -> {
        int pos = (int) v.getTag();
        // 處理業務邏輯
    });

最佳實踐建議

推薦採用 方案 3(Tag 機制),解耦 View 身分與業務邏輯,程式碼更易維護。若確實需要 View 真實 ID(如測試框架需求),再搭配 generateViewId() 使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved