调用EditText.setText()时如何禁用TextWatcher?双EditText双向监听崩溃怎么解决
问题根源
- 核心原因是双向监听触发死循环递归:你在十进制输入框的TextWatcher里修改二进制输入框的内容,会触发二进制输入框的TextWatcher回调,反过来又修改十进制输入框的内容,无限循环调用最终导致栈溢出崩溃。你之前把转换结果只设置到TextView不会触发其他输入框的监听,所以运行正常。
- 次要问题:你代码里判断
bin.getText().toString()!=binValue用了引用比较,应该用equals()方法比较字符串内容。
修复方案
首先定义全局布尔标记位,用来区分当前输入框内容修改是用户手动输入还是代码主动赋值,代码主动赋值时跳过监听逻辑避免循环触发:
// 全局变量,标记是否是程序主动设置输入框内容 private boolean isFromCode = false;
修改后的十进制TextWatcher代码
TextWatcher textDec=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) { // 程序主动修改的内容直接跳过逻辑 if (isFromCode) { return; } String binValue; String decString = dec.getText().toString().trim(); if (decString.isEmpty()) { binValue = ""; } else { // 增加异常捕获,避免用户输入非数字内容导致崩溃 try { binValue = decToBinMain(decString); } catch (Exception e) { binValue = ""; } } if (!bin.getText().toString().equals(binValue)) { textView4.setText(binValue); // 赋值前先标记为程序主动修改 isFromCode = true; bin.setText(binValue); isFromCode = false; } } }; dec.addTextChangedListener(textDec);
修改后的二进制TextWatcher代码
TextWatcher textBin=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) { // 程序主动修改的内容直接跳过逻辑 if (isFromCode) { return; } String binValue = bin.getText().toString().trim(); String decString; if(binValue.isEmpty()){ decString=""; } else { // 增加异常捕获,避免用户输入非0/1内容导致崩溃 try { decString = String.valueOf(binToDec(binValue)); } catch (Exception e) { decString = ""; } } if(!dec.getText().toString().equals(decString)) { textView.setText(decString); // 赋值前先标记为程序主动修改 isFromCode = true; dec.setText(decString); isFromCode = false; } } @Override public void afterTextChanged(Editable s) { } }; bin.addTextChangedListener(textBin);
额外优化建议
- 给输入框增加输入限制:十进制输入框仅允许输入数字,二进制输入框仅允许输入0和1,从源头上避免转换异常。
- 增加输入长度限制,避免大数转换出现溢出问题。
内容的提问来源于stack exchange,提问作者ankit yadav
相关产品推荐
相关产品推荐

