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

Android 簡易計算器 del/c 按鈕無響應:缺少 setOnClickListener 綁定

     編輯:程式設計綜合問答

問題現象

計算器界面中「刪除」(del) 和「清空」(c) 按鈕點擊無反應,數字/運算符按鈕正常。

根因定位

代碼中僅對數字鍵、運算符鍵、等號鍵調用了 setOnClickListener(this),**遺漏了 `btn_c` 和 `btn_del`**:

// 缺失的兩行
btn_c.setOnClickListener(this);
btn_del.setOnClickListener(this);

修正後的完整綁定代碼

// 數字鍵 0-9
for (int id : new int[]{R.id.btn_0, R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4,
                       R.id.btn_5, R.id.btn_6, R.id.btn_7, R.id.btn_8, R.id.btn_9}) {
    findViewById(id).setOnClickListener(this);
}
// 運算符鍵
for (int id : new int[]{R.id.btn_jia, R.id.btn_jian, R.id.btn_cheng, R.id.btn_chu}) {
    findViewById(id).setOnClickListener(this);
}
// 功能鍵
findViewById(R.id.btn_dian).setOnClickListener(this);
findViewById(R.id.btn_sum).setOnClickListener(this);
findViewById(R.id.btn_c).setOnClickListener(this);     // ← 關鍵補上
findViewById(R.id.btn_del).setOnClickListener(this);   // ← 關鍵補上

onClick 邏輯補充建議

case R.id.btn_c:
    clear_flag = false;
    et_input.setText("");
    break;

case R.id.btn_del:
    if (clear_flag) {
        clear_flag = false;
        et_input.setText("");
    } else {
        String str = et_input.getText().toString();
        if (!str.isEmpty()) {
            et_input.setText(str.substring(0, str.length() - 1));
        }
    }
    break;

代碼質量優化建議

  1. 消除重複 findViewById:用數組/循環批量綁定 (如上所示)。
  2. 提取邏輯方法:appendDigit(), appendOperator(), calculateResult() 降低 onClick 複雜度。
  3. 使用 ViewBinding / DataBinding:編譯期類型安全,消除 findViewById。
  4. 運算符處理:當前代碼用中文全角符號 +-×÷ 比較,建議統一用 ASCII + - * / 內部計算,顯示時再轉換。
  5. 邊界情況:除零、連續運算符、小數點重複、超長溢出。

現代化重寫方向 (Kotlin + ViewBinding)

// Activity 內
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding.apply {
        setContentView(root)
        // 批量設置 clickListener
        listOf(btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9,
               btnJia, btnJian, btnCheng, btnChu, btnDian, btnSum, btnC, btnDel)
            .forEach { it.setOnClickListener(this@MainActivity) }
    }
}

總結

**UI 控件必須顯式綁定監聽器才能響應事件**。新手易漏綁定功能鍵,建議用循環/數組批量綁定,配合 ViewBinding 消除樣板代碼。

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