Xamarin Android中EditText使用IInputFilter过滤字符异常如何解决
问题原因
这个问题是Android输入框架的IInputFilter机制和代码的错误实现共同导致的,核心原因有两个:
- 没有使用方法传入的
start、end参数,直接对整个source做判断和处理。source参数本身包含了软键盘的预输入(composing text)缓冲区内容,start和end才标记了本次新增的输入内容范围。 - 合法输入时主动返回了新的
Java.Lang.String对象,而不是返回null。当返回非null的字符串对象时,输入框架会认为需要替换整个待输入内容,之前过滤无效字符时返回空字符串的操作没有正确清空软键盘的预输入缓冲区,后续输入的合法字符会不断累加在缓冲区里,每次都完整返回给FilterFormatted方法。
修复方案
修改FilterFormatted的实现逻辑:
- 仅对
source中[start, end)范围的字符做合法性校验 - 所有输入都合法的场景直接返回
null,代表接受原始输入,让系统自行处理预输入缓冲区 - 存在非法字符时,只保留范围内的合法字符返回,不要直接返回空字符串(避免粘贴多字符时全部被过滤的问题)
修复后代码如下:
using System.Text; public class AlphaFilter : Java.Lang.Object, IInputFilter { public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend) { StringBuilder validBuilder = new StringBuilder(); // 仅校验本次新增的字符范围 for (int i = start; i < end; i++) { char c = source.CharAt(i); if (char.IsLetterOrDigit(c)) { validBuilder.Append(c); } } // 所有输入均合法,返回null交由系统默认处理 if (validBuilder.Length == end - start) { return null; } // 存在非法字符,返回筛选后的合法内容 return new Java.Lang.String(validBuilder.ToString()); } }
内容的提问来源于stack exchange,提问作者P. Mancini
相关产品推荐
相关产品推荐

