У меня есть следующее определение TextWatcher:
_textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(final Editable s) {
if (!s.toString().equals(_prev)) {
afterTextHandler.removeCallbacks(work);
work = new Runnable() {
@Override
public void run() {
if (!s.toString().equals(_prevQuoteAmount)) {
_prev = s.toString();
doSomething();
}
_et.append("");
}
};
afterTextHandler.postDelayed(work, 1000);
}
_et.append("");
}
};
Все работает так, как ожидалось (иногда doSomething() выполняется, а иногда нет, поэтому его выполнение не имеет отношения к вопросу), но после того, как пользователь вводит некоторый текст в компоненте EditText, к которому прикреплен этот наблюдатель, курсор текста возвращается к началу EditText.
У меня есть следующий журнал, который отображается после выполнения onTextChanged() (или выполнения его обработчика run()):
12-08 13:10:55.777 1855-1855/com.android.inputmethod.latin I/LatinIME: запуск ввода. Позиция курсора = 4,4
Почему курсор EditText помещается в начало EditText сразу после выполнения onTextChanged()?
Редактировать 1: _et.append("") - это хак, который должен переместить курсор в последнее место текста. Это не работает здесь (хотя это работает в других случаях).
Редактировать 2: Запрошенные знания о doSomething:
if (isReady()) {
Sender objSender = new Sender();
objSender.setParam1(_tvParam1.getText().toString());
objSender.setParam2(_tvParam2.getText().toString());
objSender.setParam3(_et.getText().toString());
Service.startActionSend(getActivity(), quote);
}
isReady() - проверяет условия (_tvParam1, _tvParam2, _et) перед выполнением сетевого запроса. Service.startActionSend() - выполнение асинхронного сетевого запроса (используя IntentService).
Редактировать 3: проблема возникает только при входе в метод run() обработчика.