Android中替换CommaTokenizer的逗号为竖线失效问题求助
解决MultiAutoCompleteTextView替换分隔符为竖线|的问题
嘿,我帮你捋捋这个问题~你想把MultiAutoCompleteTextView选中项后的分隔符从默认的逗号改成竖线|,但自己修改基类没生效,大概率是因为没有完整重写Tokenizer接口的所有方法,或者部分逻辑没处理到位。
问题根源
系统自带的CommaTokenizer是完全基于逗号实现三个核心方法:findTokenStart、findTokenEnd、terminateToken。如果你只修改了其中一个方法的符号,另外两个方法还是沿用逗号的判断逻辑,自然不会生效。而且直接继承系统类容易遗漏细节,不如直接自定义一个完整的Tokenizer实现。
完整的竖线分隔符Tokenizer实现
直接写一个自己的Tokenizer,把所有涉及逗号的地方替换成竖线|,同时处理好空格等细节:
public static class VerticalLineTokenizer implements Tokenizer { @Override public int findTokenStart(CharSequence text, int cursor) { int i = cursor; // 向前遍历,找到最近的竖线位置 while (i > 0 && text.charAt(i - 1) != '|') { i--; } // 跳过开头的空格(避免选中空内容) while (i < cursor && text.charAt(i) == ' ') { i++; } return i; } @Override public int findTokenEnd(CharSequence text, int cursor) { int i = cursor; int len = text.length(); // 向后遍历,找到下一个竖线的位置 while (i < len && text.charAt(i) != '|') { i++; } return i; } @Override public CharSequence terminateToken(CharSequence text) { int i = text.length(); // 跳过文本末尾的空格 while (i > 0 && text.charAt(i - 1) == ' ') { i--; } // 检查是否已经以竖线结尾,避免重复添加 if (i > 0 && text.charAt(i - 1) == '|') { return text; } else { // 这里可以调整格式:比如想让选中后显示「选项|」就写text + "|",想加空格就写text + "| " return text + "| "; } } }
怎么使用
把原来设置CommaTokenizer的代码,换成我们自定义的类就行:
// 假设你的MultiAutoCompleteTextView实例叫mAutoComplete mAutoComplete.setTokenizer(new VerticalLineTokenizer());
额外提醒
terminateToken方法是核心,它决定了选中项后会添加什么分隔符,一定要确保这里返回的内容包含竖线;- 空格处理逻辑可以根据你的UI需求调整,比如不需要空格就去掉相关的while循环;
- 不要直接修改系统
CommaTokenizer的部分方法,完整重写接口更可靠。
内容的提问来源于stack exchange,提问作者user8601021
相关产品推荐
相关产品推荐

