Intereting Posts
Выполнение HttpClient продолжает давать ConnectTimeoutException Ошибка при переходе с Java на Kotlin. Ошибка – org.gradle.api.tasks.TaskExecutionException: выполнение не выполнено для задачи ': app: compileDebugKotlin' Возможно ли обновить программу Android Manifest? Подпишитесь на уведомление BLE Gatt Android Как проверить подключение к Интернету в Android для подключения Wi-Fi? Android Studio – как изменить путь к SDK Android Android – создайте LinearLayout, который содержит прокручиваемый ListView Использует ли Android пользовательскую систему окон? Dagger 2.10 Подкомпоненты и разработчики Android Appinventor – поиск значка запуска / запуск appinventor Где добавить папку классов в Android Studio? Усилие Android ACTION_RECOGNIZE_SPEECH никогда не заканчивается после долгой речи Подсказка подсказки NavigationDrawer (например, Google Currents) Как проверить введенный пользователем номер телефона в EditText? Отправить объект json с помощью метода http post для приложения для Android

Как получить токенизатор 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, которое снова вызывает некоторые проблемы при вставке текста …

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

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