You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 08:06:05