2010-08-14 115 views
16

我正在做一个简单的程序,使用MultiAutoCompleteTextView在输入几个字母时提示常用词。当我使用“MultiAutoCompleteTextView”时,如何用空格替换逗号

代码:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
      this, 
      android.R.layout.simple_dropdown_item_1line, 
      ary); 
    MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.editText); 
    textView.setAdapter(adapter); 

    textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 

    private String[] ary = new String[] { 
     "abc", 
     "abcd", 
     "abcde", 
     "abcdef", 
     "abcdefg", 
     "hij", 
     "hijk", 
     "hijkl", 
     "hijklm", 
     "hijklmn", 
    }; 

现在,当我输入'A'并选择“ABCD”但结果却成为 “ABCD”。如何用空格替换逗号?

谢谢!

回答

40
public class SpaceTokenizer implements Tokenizer { 

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; 
} 

public int findTokenEnd(CharSequence text, int cursor) { 
int i = cursor; 
int len = text.length(); 

while (i < len) { 
    if (text.charAt(i) == ' ') { 
     return i; 
    } else { 
     i++; 
    } 
} 

return len; 
} 

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 { 
    if (text instanceof Spanned) { 
     SpannableString sp = new SpannableString(text + " "); 
     TextUtils.copySpansFrom((Spanned) text, 0, text.length(), 
       Object.class, sp, 0); 
     return sp; 
    } else { 
     return text + " "; 
    } 
} 
} 
} 
+0

我正在做类似的事情! stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42 2012-10-12 08:08:34

+1

在'findTokenStart'中,您向后迭代,然后向前....看起来像一次?为什么要这样做? – 2015-02-26 04:33:20

+1

你应该使用Character.isWhitespace而不是比较''这种方式,它适用于换行符和制表符等 – SteelBytes 2015-09-16 06:49:44

2

做到这一点的方法是实施您自己的Tokenizer。逗号出现的原因是因为您使用的是CommaTokenizer,这是专门设计用来做到这一点的。如果您需要参考如何实现您自己的SpaceTokenizer,还可以查看the source code for CommaTokenizer

+0

哦,谢谢你。 但是,当我包含“MultiAutoCompleteTextView.java”,我遇到一个错误“com.android.internal.R无法解析”,我无法找到该文件... – huaigu 2010-08-15 01:53:56

+0

Tokenizer链接已损坏。 – Elizeu 2016-07-09 18:57:41

+0

@Daniel,你能更新标记器源代码的链接吗?链接被破坏。 – tpk 2016-09-01 11:35:24

1

检查我的提问/回答

How to replace MultiAutoCompleteTextView drop down list

,你会发现一个SpaceTokenizer类

+0

是否可以在不使用标记器的情况下实现这一点?我的意思是,例如,如果我不需要任何逗号或空格作为标记化器,那么可扩展功能的工作原理是什么? – k2ibegin 2015-07-30 10:05:11

+0

你可以用你想要的任何字符改变分隔符的值。不知道你不想使用tokenizer的原因,但如果你愿意的话,你可以删除tokenizer实例。 – vsm 2015-07-31 14:08:43

+0

我更改为空间标记器,但如果我的条纹(在多自动完成的文本视图中)已经包含空格。例如。人名,那么我需要采取一些其他tokenizer或空间也可以在这个scneario中工作正常吗? – k2ibegin 2015-07-31 15:04:37