我有以下 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
为什么在 onTextChanged() 执行后 EditText 的光标会放在 EditText 的开头?
编辑 1: _et.append("") 是一个 hack,应该将光标带到文本的最后一个位置。它在这里不起作用(尽管它在其他场合起作用)。
编辑 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() 方法时发生。