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

Android RadioGroup 價格不隨選項變化:缺少 OnCheckedChangeListener

     編輯:程式設計綜合問答

問題現象

單選按鈕組(RadioGroup)無論選哪個選項,價格永遠預設 525.00。程式碼只在初始化時讀取一次選中項,未監聽後續變更。

錯誤程式碼分析

// 僅在 onCreate 執行一次,無監聽器
int selectedId = radioPackageGroup.getCheckedRadioButtonId();
RadioButton btnPackage = findViewById(selectedId);
String display_package_selected = btnPackage.getText().toString();
// ... if-else 設定價格

正確解法:設定 OnCheckedChangeListener

radioPackageGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        RadioButton selectedBtn = findViewById(checkedId);
        String text = selectedBtn.getText().toString();
        double price = 0.0;

        // 建議用 switch 或 Map 對照,避免字串比較錯誤
        switch (text) {
            case "Bronze": price = 150.00; break;
            case "Silver": price = 225.00; break;
            case "Gold":   price = 375.00; break;
            default:       price = 525.00; break;
        }

        TadGlobals.getPackagePriceInstance().setPackagePrice(price);
    }
});

關鍵改進點

  1. 事件驅動:使用者每次切換選項都會觸發 onCheckedChanged,即時更新價格。
  2. 字串比較用 equals():原碼 == 比較引用,必須改 .equals() 或 switch(Java 7+ 支援字串 switch)。
  3. 資料驅動:可用 Map 或資源陣列管理價格表,避免硬編碼 if-else。

資料驅動範例

// strings.xml
Bronze,Silver,Gold,Platinum
150.0,225.0,375.0,525.0

// 程式碼
String[] names = getResources().getStringArray(R.array.package_names);
TypedArray prices = getResources().obtainTypedArray(R.array.package_prices);

radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
    int index = group.indexOfChild(findViewById(checkedId));
    if (index >= 0) {
        double price = prices.getFloat(index, 525.0f);
        TadGlobals.getPackagePriceInstance().setPackagePrice(price);
    }
});
prices.recycle();

掌握「事件監聽 + 資料驅動」模式,能寫出可維護、可擴充的 UI 互動邏輯。

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