Android Studio Java中如何限制EditText仅输入数字并适配IP输入逻辑
解决IP输入EditText的输入限制与自动补全小数点问题
方案1:自定义InputFilter限制合法输入 + TextWatcher自动补全小数点
直接通过InputFilter过滤掉字母等非法字符,同时约束IP格式规则,配合TextWatcher实现自动补全小数点的逻辑,既解决字母输入问题,又保留自动补全功能。
XML配置
<EditText android:id="@+id/etIp" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text" />
代码实现
EditText etIp = findViewById(R.id.etIp); // 配置InputFilter,仅允许数字、小数点,同时约束IP格式 etIp.setFilters(new InputFilter[]{new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 过滤非数字、非小数点的字符 for (int i = start; i < end; i++) { char c = source.charAt(i); if (!Character.isDigit(c) && c != '.') { return ""; } } // 校验IP格式合理性 String newText = dest.subSequence(0, dstart) + source.subSequence(start, end) + dest.subSequence(dend, dest.length()); String[] segments = newText.split("\\."); // 小数点总数不能超过3(最多4个网段) if (segments.length > 4) { return ""; } // 每个网段不能超过3位,且不能以0开头(单个0除外) for (String seg : segments) { if (seg.length() > 3) { return ""; } if (seg.length() > 1 && seg.startsWith("0")) { return ""; } } return null; } }}); // 设置TextWatcher实现自动补全小数点 etIp.addTextChangedListener(new TextWatcher() { private boolean isUpdating = false; // 防止循环触发文本变更 @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 (isUpdating) { return; } isUpdating = true; // 移除原有小数点,重新按每3位添加 String pureDigits = s.toString().replaceAll("\\.", ""); StringBuilder formatted = new StringBuilder(); for (int i = 0; i < pureDigits.length(); i++) { formatted.append(pureDigits.charAt(i)); // 每3位添加小数点,且不是最后一位 if ((i + 1) % 3 == 0 && i != pureDigits.length() - 1) { formatted.append("."); } } etIp.setText(formatted.toString()); etIp.setSelection(formatted.length()); // 光标移至末尾 isUpdating = false; } });
方案2:使用inputType="numberDecimal"修复TextWatcher异常
之前设置inputType="number"会导致EditText仅允许输入数字,无法输入小数点,进而引发TextWatcher修改文本时的异常。改用numberDecimal即可支持数字和小数点输入,同时天然屏蔽字母输入。
XML配置
<EditText android:id="@+id/etIp" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="numberDecimal" />
代码实现
TextWatcher逻辑与方案1一致,无需额外过滤字母(numberDecimal已限制),只需保留自动补全小数点和IP格式校验即可。注意必须添加isUpdating标记,避免循环触发文本变更事件。
关键问题说明
- 设
inputType="number"时,EditText的Editable仅允许数字,代码中强行添加小数点会与输入类型冲突,导致异常; - 设
inputType="text"时,通过InputFilter可直接过滤字母等非法字符,同时保留对小数点的支持; - 两种方案均需通过
isUpdating标记避免TextWatcher递归触发,防止死循环。
内容的提问来源于stack exchange,提问作者darknessww
相关产品推荐
相关产品推荐

