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

效果如下:

enter image description here

以上是关于InputFilter表现不正常的主要内容,如果未能解决你的问题,请参考以下文章

带有红宝石集合/可枚举的酷技巧和富有表现力的片段[关闭]

树枝比较运算符表现不佳

如何在 Android 中使用 InputFilter 限制 EditText 中的字符?

Zend InputFilter:

不能使用Zend InputFilter Input类型的对象作为数组

执行代码时有时不显示对话框片段