Смайлики в EditText

Я пытаюсь реализовать действие с помощью EditText, который заменяет некоторые ключевые слова смайликами (мой код в конце).

Код работает отлично, за исключением одной детали. Если я наберу в EditText «.sa». Он заменяется на img1, но если я хочу его отменить, мне нужно щелкнуть 4 раза до удаления, пока изображение не исчезнет (один раз для каждого символа в ключевом слове).

Я впервые работаю с Spannables и не знаю, как это исправить. Вы можете мне помочь?

public class MytestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); EditText et = (EditText) findViewById(R.id.editText1); et.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { getSmiledText(MytestActivity.this, s); Log.e("",s.toString()); } }); } private static final HashMap<String, Integer> emoticons = new HashMap<String, Integer>(); static { emoticons.put(".sa.", R.drawable.img1); emoticons.put(".sb.", R.drawable.img2); } public static Spannable getSmiledText(Context context, Editable builder) { int index; for (index = 0; index < builder.length(); index++) { for (Entry<String, Integer> entry : emoticons.entrySet()) { int length = entry.getKey().length(); if (index + length > builder.length()) continue; if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) { builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); index += length - 1; break; } } } return builder; } } 

Вы можете попробовать что-то вроде этого:

 public void beforeTextChanged(CharSequence s, int start, int count, int after) { try { if (count == 1 && after == 0 &&// tried to delete a char s.length() >= ".sa.".length() && // string could contain an emoticon s.subSequence(start - ".sa.".length() + 1, start + 1).toString().equals(".sa.")// the last string is .sa. ) { et.setText(s.subSequence(0, s.length() - ".sa.".length())); } } catch (Exception e) { } } 

Это даст еще пару проблем (вы увидите), и это далеко не золотое решение; Я только хотел дать вам представление о том, как это сделать. Конечно, вы должны заменить способ, которым ".sa." Используется строка; Я просто закодировал его для простоты.

Как насчет catch backspace по событию прослушивателя и делать это в 3 раза больше (или удалить пространство изображения)?