Xamarin.android InputFilter行为不正确
我在Xamarin.Android应用程序上有以下输入过滤器。创建时,它会设置输入是否为仅大写、仅字母、仅数字、带分隔符的字母等,这相当灵活。该代码是在此处找到的一些Java代码的直接端口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
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文件(不确定为什么它上载了该版本-它与我这里的版本不同!)让我们来看看。