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

我试图阅读文档,但我真的很困惑。我正在尝试使用正则表达式制作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;
        }
    };


这是行不通的。这不应该只返回数字吗?碰巧的是,根据用户键入的内容,它也会返回我一些字符。

最佳答案

如果您有EditText并为其分配了InputFilter,则每次在其中更改文本时,都会调用filter()方法。类似于按钮的onClick()方法。

假设您在编辑文本之前在EditText中输入了文本“ Hello Androi”。如果按
虚拟键盘上的D键,然后触发输入过滤器,并基本询问是否可以添加d

在这种情况下,source是“ Android”,开始是6,结束是7-这是您对新文本的引用。

dest为“ Androi”,指的是EditText中的旧文本

因此,您将获得新的String以及该字符串中的位置(6,7),您必须检查该位置是否正常。如果您只会得到一个字符(例如d),则无法确定是否您刚刚输入的数字构成一个IP地址。在某些情况下,您需要全文作为上下文。

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

因此,一个简单的示例可能是:

/**
 * 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;
    }
}


它用大写版本替换了所有更改。

10-01 08:11