【问题标题】:EditText not updated after text changed in the TextWatcher在 TextWatcher 中更改文本后 EditText 未更新
【发布时间】:2011-11-18 03:17:59
【问题描述】:

我有一个 EditText 和一个 TextWatcher。

我的代码骨架:

EditText x;
x.addTextChangedListener(new XyzTextWatcher());

XyzTextWatcher implements TextWatcher() {
    public synchronized void afterTextChanged(Editable text) {
        formatText(text);
    }
}

我的 formatText() 方法在文本的某些位置插入一些连字符。

private void formatText(Editable text) {
    removeSeparators(text);

    if (text.length() >= 3) {
        text.insert(3, "-");
    }
    if (text.length() >= 7) {
        text.insert(7, "-");
    }
}

private void removeSeparators(Editable text) {
    int p = 0;
    while (p < text.length()) {
        if (text.charAt(p) == '-') {
            text.delete(p, p + 1);
        } else {
            p++;
        }
    }
}

我遇到的问题是 - 我的 EditText 上显示的内容与 Editable 不同步。当我调试代码时,我看到变量文本(Editable)具有预期值,但 EditText 上显示的内容并不总是与 Editable 匹配。

例如,当我有一个文本 x = "123-456-789" 我手动从 x 中剪切了文本“456”。 格式化后,我的 Editable 的值为“123-789-” 但是,我的 EditText 上显示的值是“123--789”

但在大多数情况下,它们具有相同的值。

我假设 EditText 是可编辑的,它们应该始终匹配。我错过了什么吗?

【问题讨论】:

  • 你能显示你在EditText/Editable中更改文本的代码吗?
  • cmets 中的代码难以阅读。您能否将该代码添加到代码块中的原始帖子中,以便我阅读?
  • @slayton 对不起!我现在已将代码添加到我的原始帖子中。谢谢。

标签: android android-edittext textwatcher


【解决方案1】:

好的,你从来没有真正改变 EditText 只是 Editable。 Android EditTexts 不是 Editable 类的子级。字符串是 Editable 类的子类。 onTextChangedListener 不接收 EditText 作为参数,而是接收 EditText 中显示的 Editable/String。使用连字符格式化 Editable 后,您需要更新 EditText。这样的事情应该可以正常工作:

class MyClass extends Activity{

    //I've ommited the onStart(), onPause(), onStop() etc.. methods

    EditText x;
    x.addTextChangedListener(new XyzTextWatcher());

    XyzTextWatcher implements TextWatcher() {
        public synchronized void afterTextChanged(Editable text) {
            String s = formatText(text);
            MyClass.this.x.setText(s);
        }
    }

}

为了防止速度变慢,为什么不改变 formatText 方法呢?

private Editable formatText(Editable text) {
    int sep1Loc = 3;
    int sep2Loc = 7;

    if(text.length==sep1Loc)
    text.append('-');

    if(text.length==sep2Loc)
    text.append('-');

    return text;
}

注意:我没有测试过这个

【讨论】:

  • 谢谢。我也试过了,它给了我预期的结果。但是,它显着减慢了输入。我不得不稍等片刻才能输入每个数字。所以,我认为这个想法是不正确的。
  • 这并不奇怪,因为每次您输入一个新数字时,听众都会被调用。您真的不需要每次输入数字时都重新格式化字符串,只有当字符串达到一定长度时。尝试在立即返回字符串的 formatText() 方法的开头放置一个 if 子句太短或不是长度不合适。
  • 由于 afterTextChanged 再次被调用,你是如何让它在没有堆栈溢出的情况下工作的?
  • 不需要在afterTextChanged方法中删除并重新添加textWatcher吗?我认为这会像@chucky 所说的那样堆栈溢出。
  • 其实EditText不需要更新,只需要编辑Editable即可!如果您的更改未被接受,请尝试检查在该 Editable 中设置的 InputFilters。过滤器可能会忽略您的更改。表示 Editable.get/setFilters.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2012-05-28
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多