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

Android 動態添加 RadioButton 獲取 ID 錯誤:必須手動 setId()

     編輯:程式設計疑難解答

問題現象

RadioGroup radioGroup = findViewById(R.id.radio_group);
for (int i = 0; i < 5; i++) {
    RadioButton rb = new RadioButton(this);
    rb.setText("Option " + i);
    radioGroup.addView(rb); // 未調用 rb.setId()
}

radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
    // checkedId 為 -1 或錯誤值,無法識別是哪個 RadioButton
    RadioButton selected = group.findViewById(checkedId); // 找不到
});

根本原因

  • 動態創建的 View **默認 ID 為 View.NO_ID (-1)**。
  • RadioGroup 內部通過子 View 的 ID 來識別選中項。
  • XML 布局中 android:id="@+id/rb1" 編譯時自動分配唯一整數 ID,動態創建需手動分配。

正確做法:分配唯一 ID

方案一:View.generateViewId() (API 17+ 推薦)

for (int i = 0; i < 5; i++) {
    RadioButton rb = new RadioButton(this);
    rb.setId(View.generateViewId()); // 自動生成唯一正整數 ID
    rb.setText("Option " + i);
    radioGroup.addView(rb);
}

方案二:手動分配正整數 (兼容舊版)

// 定義基礎 ID 避免與 R.id 衝突
private static final int DYNAMIC_ID_BASE = 0x7F000000; 

for (int i = 0; i < 5; i++) {
    RadioButton rb = new RadioButton(this);
    rb.setId(DYNAMIC_ID_BASE + i); // 確保唯一
    rb.setText("Option " + i);
    radioGroup.addView(rb);
}

方案三:用 Tag 存儲業務標識 (不依賴 ID)

for (int i = 0; i < list.size(); i++) {
    RadioButton rb = new RadioButton(this);
    rb.setId(View.generateViewId());
    rb.setTag(list.get(i).getId()); // 存業務 ID
    rb.setText(list.get(i).getName());
    radioGroup.addView(rb);
}

radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
    View selectedView = group.findViewById(checkedId);
    if (selectedView != null) {
        Long businessId = (Long) selectedView.getTag(); // 直接取業務標識
        // doSomething(businessId);
    }
});

RadioGroup 監聽最佳實踐

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (checkedId == -1) return; // 清除選中時觸發
        
        RadioButton rb = group.findViewById(checkedId);
        if (rb != null) {
            // 方式 1: 直接用文本
            String text = rb.getText().toString();
            
            // 方式 2: 取 Tag (推薦)
            Object tag = rb.getTag();
            
            // 方式 3: 遍歷獲取索引 (不依賴 ID)
            // int index = group.indexOfChild(rb);
        }
    }
});

總結

動態添加 RadioButton 到 RadioGroup **必須調用 setId() 分配唯一正整數 ID**,否則 OnCheckedChangeListener 回傳的 checkedId 為 -1 導致無法識別。推薦配合 setTag() 存儲業務標識,邏輯更清晰。

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