我有以下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()方法时才会出现问题。
答案 0 :(得分:0)
我不确定你在doSomething()中做了什么,但是如果它以某种方式改变了光标的位置,你可以使用以下(hack)来实现光标到输入文本的结尾。
<强> mEdittext.setSelection(mEdittext.length());
强>
答案 1 :(得分:0)
尝试使用布尔变量检查状态
desc.addTextChangedListener(new TextWatcher() {
boolean changed = false;
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (desc.getText().toString().isEmpty()) {
changed = false;
} else {
if(!changed) {
doSomething();
}
changed = true;
}
}
});
答案 2 :(得分:0)
,您可以使用此功能来获取要在setSelection编辑文本中使用的光标 也
private fun getNewCursorPosition(digitCountToRightOfCursor : Int, numberString : String) : Int{
var position = 0
var c = digitCountToRightOfCursor
for (i in numberString.reversed()) {
if (c == 0)
break
if (i.isDigit())
c --
position ++
}
return numberString.length - position
}
整个样本使用
editText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(p0: Editable?) {
}
override fun beforeTextChanged(p0: CharSequence?, start: Int, count: Int, after: Int) {
beforeText = p0.toString()
}
override fun onTextChanged(p0: CharSequence?, start: Int, before: Int, count: Int) {
if (p0 == null)
return
// 1. get cursor position : p0 = start + before
val initialCursorPosition = start + before
//2. get digit count after cursor position : c0
val numOfDigitsToRightOfCursor = getNumberOfDigits(beforeText.substring(initialCursorPosition,
beforeText.length))
val newAmount = formatAmount(p0.toString())
editText.removeTextChangedListener(this)
editText.setText(newAmount)
//set new cursor position
editText.setSelection(getNewCursorPosition(numOfDigitsToRightOfCursor, newAmount))
editText.addTextChangedListener(this)
}
})
您可能还需要此功能
private fun getNumberOfDigits(@NonNull text : String) : Int{
var count = 0
for (i in text)
if (i.isDigit())
count++
return count
}
答案 3 :(得分:0)
<EditText
android:id="@+id/user_input_first_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
android:maxLines="1"
android:textAllCaps="true"
android:textColor="@color/black"
android:textSize="20sp"
android:textStyle="bold" />
对我来说,当我删除textAllCaps,focusable和focusableInTouchMode时,它已解决。