Android Java简易计算器问题:等于按钮始终禁用且空值易崩溃
解决Android计算器等于按钮始终禁用与空输入崩溃问题
你的代码存在两个核心问题:
- 等于按钮初始设为
false后,没有正确的启用逻辑(原本的TextWatcher被注释,且仅计划监听单个输入框) - 点击等于按钮时未检查输入框内容,直接调用
Integer.parseInt会导致空输入/非数字输入时崩溃,且空判断逻辑完全错误(误判按钮文本而非输入框内容)
修复后的完整代码
package com.codecademy.simplecalculator; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity { EditText firstNumber; EditText secondNumber; RadioGroup operators; RadioButton add; RadioButton subtract; RadioButton divide; RadioButton multiply; Button equals; TextView result; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); firstNumber = findViewById(R.id.number1); secondNumber = findViewById(R.id.number2); operators = findViewById(R.id.Radio_Groupoperators); add = findViewById(R.id.add); subtract = findViewById(R.id.subtract); multiply = findViewById(R.id.multiply); divide = findViewById(R.id.divide); equals = findViewById(R.id.equals); result = findViewById(R.id.result); equals.setEnabled(false); // 共用输入监听,双输入框都不为空时才启用等于按钮 TextWatcher inputWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) {} @Override public void afterTextChanged(Editable s) { String firstInput = firstNumber.getText().toString().trim(); String secondInput = secondNumber.getText().toString().trim(); equals.setEnabled(!firstInput.isEmpty() && !secondInput.isEmpty()); } }; firstNumber.addTextChangedListener(inputWatcher); secondNumber.addTextChangedListener(inputWatcher); equals.setOnClickListener(v -> { String firstStr = firstNumber.getText().toString().trim(); String secondStr = secondNumber.getText().toString().trim(); // 双重校验输入完整性 if (firstStr.isEmpty() || secondStr.isEmpty()) { Toast.makeText(this, "请输入完整数字", Toast.LENGTH_SHORT).show(); return; } int firstNum, secondNum; try { // 捕获非数字输入异常 firstNum = Integer.parseInt(firstStr); secondNum = Integer.parseInt(secondStr); } catch (NumberFormatException e) { Toast.makeText(this, "请输入有效数字", Toast.LENGTH_SHORT).show(); return; } int selectedOpId = operators.getCheckedRadioButtonId(); Integer answer = null; if (selectedOpId == add.getId()) { answer = firstNum + secondNum; } else if (selectedOpId == subtract.getId()) { answer = firstNum - secondNum; } else if (selectedOpId == multiply.getId()) { answer = firstNum * secondNum; } else if (selectedOpId == divide.getId()) { // 处理除零错误 if (secondNum == 0) { Toast.makeText(this, "除数不能为0", Toast.LENGTH_SHORT).show(); return; } answer = firstNum / secondNum; } else { Toast.makeText(this, "请选择运算符", Toast.LENGTH_SHORT).show(); return; } if (answer != null) { result.setText(answer.toString()); } }); } }
关键修改说明
- 完善输入监听:创建共用的
TextWatcher绑定到两个输入框,只有双输入框都非空时才启用等于按钮 - 修复输入校验:点击按钮时先检查输入完整性,为空则直接提示并终止执行
- 添加异常处理:捕获
NumberFormatException,处理用户输入非数字的场景 - 新增除零判断:除法运算前校验除数,避免因除零导致崩溃
- 移除无效逻辑:删除原代码中判断等于按钮文本的错误逻辑
内容的提问来源于stack exchange,提问作者angélique copérée
相关产品推荐
相关产品推荐

