InputFilter表现不正常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了InputFilter表现不正常相关的知识,希望对你有一定的参考价值。
我的Xamarin.android应用程序上有以下输入过滤器。创建时,它设置输入是仅限上限,仅限alpha,仅数字,带分隔符的alpha等 - 它相当灵活。代码是这里找到的一些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
方法检查字符是否正确(例如,cap的过滤器仅检查字符是否为Upper以及是否设置了Alpha)。它很愉快。
过滤器适用于未来的代码(例如,如果我输入ASDFGjhkl,则只在编辑文本中显示ASDFG)。
问题是当我按下删除时,dest似乎仍然包含hjkl,这意味着我需要在删除字母G之前按5次删除。
我偶然发现了一个Xamarin错误,一个机器人的怪异或这是正确的行为吗?似乎很奇怪,dest不知何故在EditText小部件中拾取字符。
答案
你可以这样改变:
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;
}
效果如下:
以上是关于InputFilter表现不正常的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 中使用 InputFilter 限制 EditText 中的字符?