我的Xamarin.Android应用程序具有以下输入过滤器。创建后,它设置输入是否仅大写,仅字母,仅数字,带分隔符的字母等-相当灵活。该代码是此处找到的某些Java代码的直接端口。
public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
{
if (source is SpannableStringBuilder)
{
var sourceAsSpannableBuilder = (SpannableStringBuilder)source;
for (var i = end - 1; i >= start; i--)
{
if (!isCharacterOk(source.CharAt(i)))
{
sourceAsSpannableBuilder.Delete(i, i + 1);
}
}
return source;
}
else
{
var filteredStringBuilder = new SpannableStringBuilder();
for (int i = start; i < end; i++)
{
var currentChar = source.CharAt(i);
if (isCharacterOk(currentChar))
{
filteredStringBuilder.Append(currentChar);
}
}
return filteredStringBuilder;
}
}
isCharacterOK
方法检查字符是否正确(例如,大写字母过滤器仅检查字符是否为Upper以及是否设置了Alpha)。很高兴。
该过滤器对于以后的代码运行良好(例如,如果我键入ASDFGjhkl,则在编辑文本中仅显示ASDFG)。
问题是当我按Delete键时,目标似乎仍然包含hjkl,这意味着我需要在删除字母G之前先按Delete键5次。
我偶然发现了Xamarin错误,Android怪异现象还是这种正确行为? dest某种程度上在EditText小部件中没有拾取字符似乎很奇怪。
答案 0 :(得分:1)
您可以这样更改:
if (source is SpannableStringBuilder)
{
var sourceAsSpannableBuilder = (SpannableStringBuilder)source;
for (var i = end - 1; i >= start; i--)
{
if (!isCharacterOk(source.CharAt(i)))
{
sourceAsSpannableBuilder.Delete(i, i + 1);
//return the new SpannableStringBuilder.
sourceAsSpannableBuilder = new SpannableStringBuilder(sourceAsSpannableBuilder);
}
}
return sourceAsSpannableBuilder;
}
效果如下: