Intereting Posts
Расстояние между двумя телефонами Android Различные макеты для горизонтального и вертикального для Android-приложения? Как запустить запрос в базе данных SQLite в android? Ошибка NDK компиляции Android NDK_PROJECT_PATH = null Android – настройка Retrofit / Apache HttpClient для дайджеста Auth Компиляция и тестирование ядра Android с помощью Android Emulator Как достичь взаимосвязи «Наследование» в базе данных SQLite на Android Пользовательский элемент строки для Android для ListView Определение доступного пространства кучи для Activity (предотвращение исключения OutOfMemoryException) Получить эскиз Uri / путь к изображению, сохраненный в SD-карте + Android Force soft keyboard, чтобы показать, когда EditText получает фокус Android Studio fail add libs Универсальный загрузчик изображений Потоковое аудио MP3 через сокетную связь с использованием OpenSL ES на Android Есть ли способ автоматизировать установку Android sdk? Воспроизведение песни на музыкальном проигрывателе по умолчанию – андроид

Как получить токенизатор MultiAutoCompleteTextView, похожий на приложение Facebook?

Я создаю приложение, которое имеет поле «Кому», как в приложении «Новое сообщение» приложения Facebook.

Выбрав элемент из выпадающего списка, я создаю образы и добавлю его в MultiAutoCompleteTextView . Я использовал SpaceTokenizer для этого представления. Проблема в том, что когда я нажимаю на backspace, курсор сначала перемещается в пустое пространство (т. Tokenizer Space Tokenizer ), а затем, когда я снова нажимаю на 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+" "; } } } }); 

Я использую этот код для создания 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 правильным вариантом для такого типа поведения … Любая помощь или указатели будут благодарны …

Вот скриншот для лучшего понимания ….

Введите описание изображения здесь

У меня есть текст, за которым следует пробел, а затем курсор … Если я нахожусь в обратном пространстве, он сначала перемещается в пустое пространство, и только когда я снова ударяю обратно, весь текст удаляется ….

Вот еще один снимок экрана.

Введите описание изображения здесь

Здесь курсор не находится точно между двумя TextView s, отличными от приложения facebook, которое снова вызывает некоторые проблемы при вставке текста …

Solutions Collecting From Web of "Как получить токенизатор MultiAutoCompleteTextView, похожий на приложение Facebook?"

Нашел решение ….

Добавьте этот текстовый элемент в файл 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; @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,""); } } } } } }; 

Попробуйте добавить TextWatcher в MultiAutoCompleteTextView . Сохраните текущий текст и проверьте, удалено ли последнее место. Если это так, удалите последний токен.

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