有人可以帮我解决Android InputFilter"过滤器"方法的参数吗?(加上正则表达式)

Com*_*ver 1 java regex ip android mask

请有人可以向我解释source和dest参数的用途android.text.InputFilter#filter吗?

我试着阅读文档,但我真的很困惑.我正在尝试使用正则表达式来制作IP掩码.任何帮助表示赞赏.

我现在明白了.所以,例如,如果我有123.42,那么用户输入123.42d,我会:

dest = 123.42  
source = 123.42d  
start = 5  
end = 6

InputFilter[] filters = new InputFilter[1];
    filters[0] = new InputFilter() 
    {
        public CharSequence filter(CharSequence source, int start, int end, Spanned  dest, int dstart, int dend) 
        {               
            String destTxt = dest.toString();
            String resultingTxt = destTxt.substring(0, dstart) +                           source.subSequence(start, end) + destTxt.substring(dend);                

            if(resultingTxt.equals("")) return "";

            int lastChar = resultingTxt.length() -1;

            if(String.valueOf(resultingTxt.charAt(lastChar)).matches("[^0-9.]"))
            {
                return "";
            }

            return null;
        }
    };
Run Code Online (Sandbox Code Playgroud)

这不行.这不应该只返回数字吗?它会发生,取决于用户类型,它也会返回字符.

zap*_*apl 12

如果您有一个EditText并且为其分配了一个InputFilter,那么每次更改其中的文本时,filter()都会调用该方法.很像onClick()按钮的方法.

假设您在编辑之前在EditText中有"Hello Androi"文本.如果您按下D虚拟键盘上的键,则会触发inputfilter并基本上询问是否可以添加d.

在那种情况下source是"Android",开始是6,结束是7 - 这是你对新文本的引用.

dest 将是"Androi",并指的是你的旧文本 EditText

所以你得到新的String和该字符串中的位置(6,7),你必须检查它是否正常.如果您只是获得一个字符(例如d),则无法确定您刚刚输入的数字是否形成了ip地址.在某些情况下,您需要将整个文本作为上下文.

如果新文本正常,则返回null,如果要跳过更改,则返回空String(""),否则返回替换更改的字符.

所以一个简单的例子可能是:

/**
 * Simplified filter that should make everything uppercase
 * it's a demo and will probably not work
 *  - based on InputFilter.AllCaps
 */
public static class AllCaps implements InputFilter {
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {

        // create a buffer to store the edited character(s).
        char[] v = new char[end - start];

        // extract the characters between start and end into our buffer
        TextUtils.getChars(source, start, end, v, 0);

        // make the characters uppercase
        String s = new String(v).toUpperCase();

        // and return them
        return s;
    }
}
Run Code Online (Sandbox Code Playgroud)

它正在用它的大写版本取代每一个变化.