Я пытаюсь реализовать действие с 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;
}
}