我有一个编辑文本
字段,上面有一个客户文本观察者。在一段代码中,我需要更改EditText中的值,我使用<code>.setText(“whather”)来执行此操作。
问题是,只要我做了更改,就会调用<code>afterextchanged
我需要 afterTextChanged 方法中的文本,因此不建议删除 TextWatcher
。
Java:
public class MyTextWatcher implements TextWatcher {
private EditText editText;
// Pass the EditText instance to TextWatcher by constructor
public MyTextWatcher(EditText editText) {
this.editText = editText;
}
@Override
public void afterTextChanged(Editable e) {
// Unregister self before update
editText.removeTextChangedListener(this);
// The trick to update text smoothly.
e.replace(0, e.length(), e.toString());
// Re-register self after update
editText.addTextChangedListener(this);
}
...
}
Kotlin:
class MyTextWatcher(private val editText: EditText) : TextWatcher {
override fun afterTextChanged(e: Editable) {
editText.removeTextChangedListener(this)
e.replace(0, e.length, e.toString())
editText.addTextChangedListener(this)
}
...
}
用法:
et_text.addTextChangedListener(new MyTextWatcher(et_text));
如果您使用 editText.setText() 而不是 editable.replace(),则在快速输入文本时,您可能会感到有点滞后。
您可以取消注册观察者,然后重新注册它。
或者,您可以设置一个标志,以便您的观察者知道您自己何时更改了文本(因此应该忽略它)。
您可以检查当前哪个视图具有区分用户和程序触发事件的焦点。
EditText myEditText = (EditText) findViewById(R.id.myEditText);
myEditText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (myEditText.hasFocus()) {
// is only executed if the EditText was directly changed by the user
}
}
//...
});
作为简短答案的补充:如果myEditText
在您以编程方式更改文本时已经具有焦点,您应该调用clearFocus()
,然后调用setText(...)
,然后重新请求焦点。将其放入实用程序函数中是个好主意:
void updateText(EditText editText, String text) {
boolean focussed = editText.hasFocus();
if (focussed) {
editText.clearFocus();
}
editText.setText(text);
if (focussed) {
editText.requestFocus();
}
}
对于Kotlin:
因为Kotlin支持扩展函数,所以您的效用函数可能如下所示:
fun EditText.updateText(text: String) {
val focussed = hasFocus()
if (focussed) {
clearFocus()
}
setText(text)
if (focussed) {
requestFocus()
}
}
问题内容: 我有一个带有客户文本监视程序的字段。在一段代码中,我需要更改使用的EditText中的值。 问题是,一旦我进行更改,就会调用该方法,从而创建了无限循环。如何在不触发afterTextChanged的情况下更改文本? 我需要afterTextChanged方法中的文本,因此不建议删除。 问题答案: 您可以注销观察者,然后重新注册。 另外,您可以设置一个标志,以便观察者知道自己刚刚更改文本
问题内容: 我想在字体为时使用光标。 那可能吗? 问题答案: 您可以定制一个。
我必须取编辑文本的值并将其除以1.21....错误在哪里 错误:
我有一个动作执行,其中一个if/fe是如果用户按“A”键,它会将文本设置为不同的内容。程序不是在按“A”后设置文本,而是跳过设置文本并向下移动到下面的if语句。我的问题是,如何让我的程序在我的if语句之前设置文本?我的代码在下面,谢谢!
我有一堆CSV文件,它们是作为数据流读取的。对于每个dataframe,我希望更改一些列名,如果某个dataframe中存在特定列: column_name_update_map={'aa':'xx';'bb':'yy'}
在我的Android项目中,我必须将TextChangedListener(TextWatcher)添加到编辑文本视图中。它有三个部分: < Li > < code > ontext changed() < Li > < code > beforeTextChanged() < Li > < code > afterTextChanged() 这三个有什么区别?我必须在键侦听器上实现一个表搜索,对