如何使EditText只接受IP地址作为输入?

时间:2015-02-14 11:01:51

标签: android

这是我的EditText,并希望使其仅接受IP地址。我使用numberDecimal作为inputType但它不接受多个点。

<EditText
                android:id="@+id/etBannedIpAddress"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                android:hint="IP Address"
                android:inputType="numberDecimal"
                android:textAppearance="@android:style/TextAppearance.Small"
                android:textColor="@color/blue_text" />

4 个答案:

答案 0 :(得分:12)

尝试这样: 通过使用输入过滤器,我们可以在输入值之前过滤数据。

InputFilter[] filters = new InputFilter[1];
        filters[0] = new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end,
                    android.text.Spanned dest, int dstart, int dend) {
                if (end > start) {
                    String destTxt = dest.toString();
                    String resultingTxt = destTxt.substring(0, dstart)
                            + source.subSequence(start, end)
                            + destTxt.substring(dend);
                    if (!resultingTxt
                            .matches("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) {
                        return "";
                    } else {
                        String[] splits = resultingTxt.split("\\.");
                        for (int i = 0; i < splits.length; i++) {
                            if (Integer.valueOf(splits[i]) > 255) {
                                return "";
                            }
                        }
                    }
                }
                return null;
            }

        };
        editTxxt.setFilters(filters);

答案 1 :(得分:4)

方法1 :使用输入过滤器,请尝试以下代码:

EditText text = new EditText(this);
    InputFilter[] filters = new InputFilter[1];
    filters[0] = new InputFilter() {
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if (end > start) {
                String destTxt = dest.toString();
                String resultingTxt = destTxt.substring(0, dstart) + source.subSequence(start, end) + destTxt.substring(dend);
                if (!resultingTxt.matches ("^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3})?)?)?)?)?)?")) { 
                    return "";
                } else {
                    String[] splits = resultingTxt.split("\\.");
                    for (int i=0; i<splits.length; i++) {
                        if (Integer.valueOf(splits[i]) > 255) {
                            return "";
                        }
                    }
                }
            }
        return null;
        }
    };
    text.setFilters(filters);

它检查是否存在四个数字,以点分隔,但没有一个大于255.验证是实时进行的,即在输入时。

但您需要编写如上所述的自定义输入过滤器代码。

方法2:添加android:inputType="number|numberDecimal"android:digits="0123456789."

<EditText
    android:id="@+id/ip_address"
    android:inputType="number|numberDecimal"
    android:digits="0123456789."
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

答案 2 :(得分:0)

我用这个:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

private static final String IPV4_REGEX =
            "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
                    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
                    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
                    "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";

    private static final Pattern IPv4_PATTERN = Pattern.compile(IPV4_REGEX);

之后

boolean verifyIP()
    {
        String ip = textview.getText().toString();
        if (ip == null) return false;

        Matcher matcher = IPv4_PATTERN.matcher(ip);
        return matcher.matches();
    }

答案 3 :(得分:0)

如果您想在 Kotlin 中执行此操作,并且还要向 IP 添加端口。

private fun setEditText() {
    val input = binding.etPuerto
    input.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
    val filters = arrayOfNulls<InputFilter>(1)
    filters[0] = filterIP()
    input.filters = filters
}

private fun filterIP(): InputFilter {
    return InputFilter { source, start, end, dest, dstart, dend ->
        if (attr.end > start) {
            val destTxt = dest.toString()
            val resultingTxt = (destTxt.substring(0, dstart)
                    + source.subSequence(start, end)
                    ) + destTxt.substring(dend)
            if (!resultingTxt.matches(
                    Regex(
                        "^\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(\\.(\\d{1,3}(:(\\d{1,5})?)?)?)?)?)?)?)?"
                    )
                )
            )
                return@InputFilter ""
        }
        null
    }
}