请有人可以向我解释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;
}
}
它用大写版本替换了所有更改。