Android 如何获得类似于Facebook应用程序的MultiAutoCompleteTextView标记器?

Android 如何获得类似于Facebook应用程序的MultiAutoCompleteTextView标记器?,android,android-layout,android-edittext,multiautocompletetextview,Android,Android Layout,Android Edittext,Multiautocompletetextview,我正在创建一个应用程序,它有一个“To”字段,就像Facebook应用程序的“newmessage”功能一样 从下拉列表中选择一个项目后,我创建了一个imagespan并将其添加到MultiAutoCompleteTextView。我在这个视图中使用了SpaceTokenizer。问题是,当我单击backspace时,光标首先移动到空白处(即空格标记器),然后当我再次单击backspace时,整个单词被删除…我想在第一次单击backspace时删除整个单词,就像facebook应用程序一样 这是

我正在创建一个应用程序,它有一个“To”字段,就像Facebook应用程序的“newmessage”功能一样

从下拉列表中选择一个项目后,我创建了一个imagespan并将其添加到
MultiAutoCompleteTextView
。我在这个视图中使用了
SpaceTokenizer
。问题是,当我单击backspace时,光标首先移动到空白处(即空格
标记器
),然后当我再次单击backspace时,整个单词被删除…我想在第一次单击backspace时删除整个单词,就像facebook应用程序一样

这是我的
SpaceTokenizer

     multiContentText.setTokenizer(new Tokenizer(){
     public int findTokenStart(CharSequence text, int      cursor) {
        int i = cursor;
        if(i>0){
            Log.d("textchar ",""+text.charAt(i - 1));
        }

        while (i > 0 && text.charAt(i - 1) != ' ') {
            i--;
        }
        while (i < cursor && text.charAt(i) == ' ' || text.charAt(i - 1) == '\n') {
            i++;
        }

        return i;
    }

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

        while (i < len) {
            if (text.charAt(i) == ' ' || text.charAt(i - 1) == '\n') {
                return i;
            } else {
                i++;
            }
        }

        return len;
    }

    public CharSequence terminateToken(CharSequence text) {
        int i = text.length();
        while (i > 0 && text.charAt(i - 1) == ' ' || text.charAt(i - 1) == '\n') {
            i--;
        }

        if (i > 0 && text.charAt(i - 1) == ' ' || text.charAt(i - 1) == '\n') {
            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+" ";
            }
        }
    }
});
我不确定空格
标记器
是否是这种行为的正确选项…任何帮助或指点都将不胜感激

以下是更好理解的屏幕截图

我有一个文本,后跟一个空格,然后是一个光标……如果我点击backspace,它首先会移动到空白处,只有当我再次点击backspace时,整个文本才会被删除

这是另一个截图


这里的光标不在两个
TextView
s之间,这与facebook应用程序不同,facebook应用程序在插入文本时再次导致一些问题…

尝试向
MultiAutoCompleteTextView
添加
TextWatcher
。 保存当前文本并检查最后一个空格是否已删除。 如果是,请删除最后一个令牌。

找到了解决方案

将此textwatcher添加到multiautocompletetextview

private TextWatcher textWather = new TextWatcher() {
    int noOfCharAdded=0;int noOfCharDeleted=0;
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        startIdx=start;
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,int after) {
        noOfCharAdded=after;
        noOfCharDeleted=count;
    }
    @Override
    public void afterTextChanged(Editable s) {
        Editable buffer = s;
        int start = multiContentText.getSelectionStart()<0?0:multiContentText.getSelectionStart();
        int end = multiContentText.getSelectionEnd()<0?0:multiContentText.getSelectionEnd();
                if(noOfCharAdded==0 && noOfCharDeleted==1){ //if space is deleted
                        if (start == end && delPrevText) {                          
                            ImageSpan link[] = buffer.getSpans(start, end,ImageSpan.class);
                            if (link.length > 0) {                                  
                                buffer.replace(buffer.getSpanStart(link[0]),buffer.getSpanEnd(link[0]),"");
                                buffer.removeSpan(link[0]);
                            }
                        }
                        delPrevText=true; 
                        multiContentText.setSelection(multiContentText.getText().length());
                }
                else if(noOfCharAdded==0 && noOfCharDeleted>1){//if the whole word is deleted
                        if(buffer.length()>0){                                           
                            if(start<buffer.length()){
                               delPrevText=false;                                  
                               if(buffer.charAt(start)==' '){                                       
                                  buffer.replace(start,start+1,"");
                               }
                            }
                        }                      
                }               

    }
};
private TextWatcher textWather=new TextWatcher(){
int noOfCharAdded=0;int noOfCharDeleted=0;
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
startIdx=开始;
}
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
noOfCharAdded=之后;
noOfCharDeleted=计数;
}
@凌驾
公共无效后文本已更改(可编辑){
可编辑缓冲区=s;
int start=multicontext.getSelectionStart()1){//如果删除了整个单词
如果(buffer.length()>0){
如果(开始
可编辑缓冲区=s;
int start=multicontext.getSelectionStart()0{

如果(开始在计算长度之前,你是否尝试修剪charsequence文本?是的。我尝试修剪长度。当我这样做时,光标立即出现在textview之后,这会导致建议列表消失,因为之前没有空间。我在问题中添加了屏幕截图,请查看以更好地理解。嗨,你决定了吗我解决了这个问题。如果你有…@VijayRaj如果你想使用goole的代码来解决这个问题,请检查这个:,这里的代码:@VijayRaj嗨,你已经从你的答案中解决了你的问题吗?因为它对我不起作用。请给我一些建议我已经有了文本观察程序到MultiAutoCompleteTextView…并尝试了各种各样的方法方法,但找不到解决方案…如果你能共享代码,这将是一个很大的帮助…你也在努力解决这个问题???。我被不同分辨率的手机卡住了,edittext中的光标不闪烁。如果你解决了这类问题,请让我知道@VijayRajYeah…我面临着光标根本不闪烁的相同问题在edittext中sible…我还看到Google+应用程序不允许光标在两个文本之间…不知道他们怎么做…我无法将光标放在每行编辑文本的最后一个芯片上…你能帮我吗…@Vijay Raji编辑了我的答案…我添加了
multiContentText.setSelection(multiContentText.getText().length())
在后文本更改方法中感谢您的回复我已经添加了上述行,我的问题是我在编辑文本中插入了4个联系人,添加后所有气泡都在编辑文本中出现在2行中。然后如果我将光标放在第一行的最后一个芯片上,那么光标正好放在芯片后面,但不在令牌后面。但它应该在在标记器之后。@Vijay Raji也有这个问题…但是当你尝试删除该芯片时,即使该芯片后面的标记器也将被删除,然后光标将再次移动到末尾…嗨,Vijay,我也可以通过单击删除逗号。当我们用逗号删除图像跨度时,我如何获得删除的文本。我正在浏览e。因此,我想从存储值中删除该字符串。因此,我需要删除的字符串。请回复@Vijay rajay,说明如何将clicklistener添加到textview中的不同项目中以删除文本。
private TextWatcher textWather = new TextWatcher() {
    int noOfCharAdded=0;int noOfCharDeleted=0;
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        startIdx=start;
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,int after) {
        noOfCharAdded=after;
        noOfCharDeleted=count;
    }
    @Override
    public void afterTextChanged(Editable s) {
        Editable buffer = s;
        int start = multiContentText.getSelectionStart()<0?0:multiContentText.getSelectionStart();
        int end = multiContentText.getSelectionEnd()<0?0:multiContentText.getSelectionEnd();
                if(noOfCharAdded==0 && noOfCharDeleted==1){ //if space is deleted
                        if (start == end && delPrevText) {                          
                            ImageSpan link[] = buffer.getSpans(start, end,ImageSpan.class);
                            if (link.length > 0) {                                  
                                buffer.replace(buffer.getSpanStart(link[0]),buffer.getSpanEnd(link[0]),"");
                                buffer.removeSpan(link[0]);
                            }
                        }
                        delPrevText=true; 
                        multiContentText.setSelection(multiContentText.getText().length());
                }
                else if(noOfCharAdded==0 && noOfCharDeleted>1){//if the whole word is deleted
                        if(buffer.length()>0){                                           
                            if(start<buffer.length()){
                               delPrevText=false;                                  
                               if(buffer.charAt(start)==' '){                                       
                                  buffer.replace(start,start+1,"");
                               }
                            }
                        }                      
                }               

    }
};
Editable buffer = s;
int start = multiContentText.getSelectionStart()<0?0:multiContentText.getSelectionStart();
int end = multiContentText.getSelectionEnd()<0?0:multiContentText.getSelectionEnd();
if(noOfCharAdded==0 && noOfCharDeleted==1){ //if space is deleted
    if (start == end && delPrevText) {                          
        ImageSpan link[] = buffer.getSpans(start, end,ImageSpan.class);
        if (link.length > 0) {
            for(int i=0;i<contentArray.size();i++){
                JSONObject jo=contentArray.get(i);
                try {
                    int keyValue=jo.getInt("startIndx");//No i18N                                                                               
                    if(keyValue==buffer.getSpanStart(link[0])){                                                 
                           jo.put("isRemoved", true);   
                           contentArray.set(i,jo);                                              
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
            buffer.replace(buffer.getSpanStart(link[0]),buffer.getSpanEnd(link[0]),"");
            buffer.removeSpan(link[0]);
        }
    }
    delPrevText=true;
            multiContentText.setSelection(multiContentText.getText().length());                 
}
else if(noOfCharAdded==0 && noOfCharDeleted>1){//if the whole word is deleted
    if(buffer.length()>0){                                           
        if(start<buffer.length()){
           delPrevText=false;
           for(int i=0;i<contentArray.size();i++){
                JSONObject jo=contentArray.get(i);
                try {
                    int keyValue=jo.getInt("startIndx");//No i18N                                                                               
                    if(keyValue==start){                                
                           jo.put("isRemoved", true);   
                           contentArray.set(i,jo);                                              
                    }
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           if(buffer.charAt(start)==' '){                                       
              buffer.replace(start,start+1,"");
           }
        }
    }              
}