在编辑文本之间如何使用自动完成android

在编辑文本之间如何使用自动完成android,android,autocomplete,android-edittext,Android,Autocomplete,Android Edittext,我知道如何在android中使用EditText,以及如何在android中使用自动完成EditText。但AutoCompleteEditText的使用类似于下拉列表,用户在其中键入字符并显示建议,用户单击其中一个建议。如果没有建议,则不会显示任何文本 我的要求是,考虑一下有一个编辑文本。用户可以键入他们想要的任何内容,但当单词以特殊字符(例如“@”)开头时,api将点击并显示建议 完整示例: “我叫詹姆斯·邦德,我是@和” 在上面的例子中,当用户在“@和”结尾键入这句话时,它将显示点击API

我知道如何在android中使用EditText,以及如何在android中使用自动完成EditText。但AutoCompleteEditText的使用类似于下拉列表,用户在其中键入字符并显示建议,用户单击其中一个建议。如果没有建议,则不会显示任何文本

我的要求是,考虑一下有一个编辑文本。用户可以键入他们想要的任何内容,但当单词以特殊字符(例如“@”)开头时,api将点击并显示建议

完整示例:

“我叫詹姆斯·邦德,我是@和”

在上面的例子中,当用户在“@和”结尾键入这句话时,它将显示点击API的自动建议(应该显示Android),用户可以从列表中选择这个建议的单词

有没有办法做到这一点

请帮帮我


谢谢。

Android提供了
MultiAutoCompleteTextView
。使用此小部件而不是EditText并覆盖其标记器

MultiAutoCompleteTextView myautocomplete = (MultiAutoCompleteTextView) findViewById(R.id.multy);
    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array_for_autocomplete);
    myautocomplete.setAdapter(adapter);

    myautocomplete.setTokenizer(new MultiAutoCompleteTextView.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) {
                if (text.charAt(i) == ',') {
                    return i;
                } else {
                    i++;
                }
            }

            return len;
        }

        @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 {
                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 + ", ";
                }
            }
        }
    });
MultiAutoCompleteTextView myautocomplete=(MultiAutoCompleteTextView)findViewById(R.id.multy);
ArrayAdapter=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,用于自动完成的数组);
myautocomplete.setAdapter(适配器);
myautocomplete.setTokenizer(新的MultiAutoCompleteTextView.Tokenizer(){
@凌驾
公共int findTokenStart(字符序列文本,int游标){
int i=光标;
而(i>0&&text.charAt(i-1)!='@')){
我--;
}
而(i0&&text.charAt(i-1)=''){
我--;
}
如果(i>0&&text.charAt(i-1)=','){
返回文本;
}否则{
if(已跨越的文本实例){
SpannableString sp=新的SpannableString(文本+“,”);
TextUtils.copySpansFrom((跨距)text,0,text.length(),
对象类,sp,0);
返回sp;
}否则{
返回文本+“,”;
}
}
}
});

文档:

在AutoCompleteTextView中没有setTokenizer()方法使用
MultiAutoCompleteTextView
和重写方法。它确实有setTokenizer()方法。不,这不是我问题的解决方案。我更新了我的答案,这次我亲自测试了它。它工作得很好。完整的工作代码。这实际上很好,我可以在从建议中选择后删除@吗???应仅显示选定的建议。