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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:17:17