InputFilter行为不正确

时间:2019-04-26 13:06:20

标签: xamarin.android

我的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小部件中没有拾取字符似乎很奇怪。

1 个答案:

答案 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;
    }

效果如下:

enter image description here