Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android InputFilter行为不正确_Xamarin.android - Fatal编程技术网

Xamarin.android InputFilter行为不正确

Xamarin.android InputFilter行为不正确,xamarin.android,Xamarin.android,我在Xamarin.Android应用程序上有以下输入过滤器。创建时,它会设置输入是否为仅大写、仅字母、仅数字、带分隔符的字母等,这相当灵活。该代码是在此处找到的一些Java代码的直接端口 public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend) { if (source is SpannableSt

我在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;
        }
    }
public ICharSequence FilterFormatted(ICharSequence源、int开始、int结束、ISpanned结束、int开始、int结束)
{
if(来源为SpannableStringBuilder)
{
var sourceAsSpannableBuilder=(SpannableStringBuilder)source;
对于(变量i=end-1;i>=start;i--)
{
如果(!isCharacterOk(source.CharAt(i)))
{
sourceAsSpannableBuilder.Delete(i,i+1);
}
}
返回源;
}
其他的
{
var filteredStringBuilder=new SpannableStringBuilder();
for(int i=start;i
isCharacterOK
方法检查字符是否正确(例如,caps过滤器仅检查字符是否为上限以及是否设置了Alpha)。它工作得很愉快

过滤器可以很好地处理后续代码(例如,如果我键入ASDFGjhkl,则只有ASDFG显示在edittext中)

问题是当我按delete键时,dest似乎仍然包含hjkl,这意味着在删除字母G之前,我需要按delete键5次


我是否偶然发现了一个Xamarin bug,一个android怪胎,或者这是正确的行为?似乎很奇怪,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;
    }
效果如下:


这仍然返回相同的问题(如果没有使问题变得更糟的话)。以前输入ASDFGhjkl会显示ASDFG,需要5次删除才能删除G。现在输入asdfgasdfgfhc,你能显示isCharacterOk的代码吗?我测试它只过滤大写字符,它对meAre有效你遗漏了什么吗?我在这里遇到了一个错误,缺少
content\u main
执行更新-更正了axml文件(不确定为什么它上载了该版本-它与我这里的版本不同!)让我们来看看。