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

EditText数字去重异常:输入含重复数字的多位数时误判重复

解决EditText数字重复输入误判问题

嘿,我太懂你这个踩坑的感受了——输入1之后再输10被判定重复,这明显是字符串子串匹配在搞鬼!你之前的逻辑应该是用了contains()之类的方法,导致程序把"10"里的"1"当成了已存在的完整数字,直接误判重复。咱们来一步步把这个问题搞定:

问题根源

你之前的判断逻辑大概率是检查文本是否包含某个子串,而不是做完整字符串/数字的完全匹配。比如当你在某个EditText输入"10"时,程序会错误地认为它包含已经输入的"1",从而判定重复,但实际上这是两个完全不同的数字。

解决方案

我们需要做的是:收集所有EditText的内容,对当前输入的完整内容做完全匹配判断,同时还要考虑数字的有效性(比如避免非数字输入)。

步骤1:统一管理所有EditText

先把9个EditText放到一个列表里,这样后续遍历检查会更方便:

private List<EditText> allEditTexts;

// 在Activity的onCreate方法里初始化列表
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    
    // 先初始化每个EditText
    EditText et0 = findViewById(R.id.et0);
    EditText et1 = findViewById(R.id.et1);
    EditText et2 = findViewById(R.id.et2);
    // ... 依次初始化et3到et8
    
    // 把所有EditText存入列表
    allEditTexts = Arrays.asList(et0, et1, et2, et3, et4, et5, et6, et7, et8);
    
    // 给每个EditText添加文本监听
    for (EditText edt : allEditTexts) {
        editTextWatcher(edt);
    }
}

步骤2:修改TextWatcher的判断逻辑

把原来的子串匹配改成完全字符串匹配,如果需要严格匹配数字(比如"01"和"1"算同一个数字),还可以转成整数再比较:

public void editTextWatcher(final EditText edt) {
    edt.addTextChangedListener(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) {
            String currentInput = s.toString().trim();
            
            // 空文本直接跳过检查
            if (currentInput.isEmpty()) {
                edt.setError(null);
                return;
            }

            boolean isDuplicate = false;
            try {
                // 把输入转成整数,严格匹配数字值
                int currentNum = Integer.parseInt(currentInput);
                
                for (EditText otherEdt : allEditTexts) {
                    // 跳过当前正在编辑的EditText
                    if (otherEdt == edt) {
                        continue;
                    }
                    
                    String otherText = otherEdt.getText().toString().trim();
                    if (!otherText.isEmpty()) {
                        int otherNum = Integer.parseInt(otherText);
                        // 完全匹配数字值才判定重复
                        if (currentNum == otherNum) {
                            isDuplicate = true;
                            break;
                        }
                    }
                }
            } catch (NumberFormatException e) {
                // 输入不是有效数字,提示用户
                edt.setError("请输入有效整数");
                return;
            }

            if (isDuplicate) {
                edt.setError("该数字已存在,不可重复输入");
                // 可选:自动清除重复输入(恢复到输入前的状态)
                // edt.setText(s.subSequence(0, start));
                // edt.setSelection(start);
            } else {
                edt.setError(null);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {}
    });
}

额外优化:限制输入为数字

为了避免用户输入非数字内容,可以在XML布局里给EditText设置输入类型:

<EditText
    android:id="@+id/et0"
    android:inputType="number"
    android:digits="0123456789"
    ... />

这样就能彻底解决输入1后再输10被误判重复的问题啦!

内容的提问来源于stack exchange,提问作者AZER

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:03:26