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)
它正在用它的大写版本取代每一个变化.