当前位置: 首页 > 知识库问答 >
问题:

如何在不触发文本观察程序的情况下更改EditText文本?

亢胤运
2023-03-14

我有一个编辑文本字段,上面有一个客户文本观察者。在一段代码中,我需要更改EditText中的值,我使用<code>.setText(“whather”)来执行此操作。

问题是,只要我做了更改,就会调用<code>afterextchanged

我需要 afterTextChanged 方法中的文本,因此不建议删除 TextWatcher

共有3个答案

陆烨磊
2023-03-14

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(),则在快速输入文本时,您可能会感到有点滞后。

陈扬
2023-03-14

您可以取消注册观察者,然后重新注册它。

或者,您可以设置一个标志,以便您的观察者知道您自己何时更改了文本(因此应该忽略它)。

温嘉赐
2023-03-14

您可以检查当前哪个视图具有区分用户和程序触发事件的焦点。

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() 这三个有什么区别?我必须在键侦听器上实现一个表搜索,对