请有人可以向我解释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
键,然后触发 inputfilter 并基本上询问是否可以添加 d
。
在这种情况下,source
是“Android”,开始是 6,结束是 7 - 这是您对新文本的引用。
dest
将是“Androi”,指的是您的 EditText
因此您获得了新字符串和该字符串中的一个位置(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;
}
}
它用它的大写版本替换每个更改。
关于java - 有人可以帮我处理 Android InputFilter "filter"方法的参数吗? (加上正则表达式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9815433/