gpt4 book ai didi

android - TextWatcher - 光标回到 EditText 的开头

转载 作者:行者123 更新时间:2023-12-04 23:55:33 25 4
gpt4 key购买 nike

我有以下 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: Starting input. Cursor position = 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() 方法时发生。

最佳答案

您可以使用此函数获取要在编辑文本的 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
}

引用:FULL Code Description

关于android - TextWatcher - 光标回到 EditText 的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41040469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com