按 "." 很多次(在输入时验证EditText中的IP地址)

Xur*_*ajB 2 validation user-interface android android-edittext

我有以下EditText:

 <EditText
android:id="@+id/ip"
android:layout_width="200dip"
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="numberDecimal">
</EditText>
Run Code Online (Sandbox Code Playgroud)

我想用它来获取IP地址.但它不允许我键入'.' (句点符号)不止一次因为inputtype设置为numberDecimal.关于如何获得多个"."的任何建议.同时将inputType设置为数字.

Ale*_*dam 21

您需要创建自己的InputFilter:http://developer.android.com/reference/android/text/InputFilter.html

看一下我前面写的这个答案:如何设置Edittext视图只允许两个数值和两个十进制值,如##.##


更新 - 示例代码

这是对该过滤器的改编以验证ips.它检查是否存在四个数字,用点分隔,但没有一个大于255.验证是实时进行的,即在打字时.

    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);
Run Code Online (Sandbox Code Playgroud)