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
相关产品推荐
相关产品推荐

