InputFilter表现不正常

问题描述 投票:0回答:1

我的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小部件中拾取字符。

xamarin.android
1个回答
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


推荐问答