如何获得MultiAutoCompleteTextView tokenizer与Facebook应用类似?

我正在创build一个具有“To”字段的应用程序,就像Facebook应用程序的“新消息”function一样。

从下拉列表中select一个项目后,我创build一个imagespan并将其添加到MultiAutoCompleteTextView 。 我已经使用SpaceTokenizer这个观点。 问题是当我点击backspace时,光标首先移动到空的空间(即空间Tokenizer ),然后当我再次单击退格时,整个单词被删除….我想删除整个单词上我的第一次点击退格就像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+" "; } } } }); 

我正在使用此代码在我的multi-ContentText中创build一个TextView

 SpannableStringBuilder ssb = new SpannableStringBuilder(multiContentText.getText()); String c="text from the list"; TextView textView = (TextView) inflater.inflate(R.layout.chips_edittext, null); textView.setText(c); // set text int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); textView.measure(spec, spec); textView.layout(0, 0, textView.getMeasuredWidth(), textView.getMeasuredHeight()); Bitmap b = Bitmap.createBitmap(textView.getWidth(), textView.getHeight(),Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(b); canvas.translate(-textView.getScrollX(), -textView.getScrollY()); textView.draw(canvas); textView.setDrawingCacheEnabled(true); Bitmap cacheBmp = textView.getDrawingCache(); Bitmap viewBmp = cacheBmp.copy(Bitmap.Config.ARGB_8888, true); textView.destroyDrawingCache(); // destory drawable // create bitmap drawable for imagespan BitmapDrawable bmpDrawable = new BitmapDrawable(viewBmp); bmpDrawable.setBounds(0, 0,bmpDrawable.getIntrinsicWidth(),bmpDrawable.getIntrinsicHeight()); // create and set imagespan ssb.setSpan(new ImageSpan(bmpDrawable),0 ,c.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // set chips span multiContentText.setText(ssb); multiContentText.setSelection(multiContentText.getText().length()); 

我不知道空间Tokenizer是否是这种types的行为的正确select…任何帮助或指针将不胜感激…

这里是更好的理解截图。

在这里输入图像说明

我有一个文本后跟一个空格,然后一个光标…如果我打回退,它首先移动到空的空间,只有当我再次击退退格时,整个文本被删除….

这是另一个截图

在这里输入图像说明

这里的光标不完全在两个TextView之间,不像Facebook应用程序中,这又在插入文本时导致一些问题…

Solutions Collecting From Web of "如何获得MultiAutoCompleteTextView tokenizer与Facebook应用类似?"

find解决scheme….

将这个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,""); } } } } } }; 

尝试添加一个TextWatcherMultiAutoCompleteTextView 。 保存当前文本并检查最后一个空格是否被删除。 如果是这样,请删除最后一个标记。

 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,""); } } } }