4

我有一个 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 不同步。当我调试代码时,我看到变量 text (Editable) 具有预期值,但 EditText 上显示的内容并不总是与 Editable 匹配。

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

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

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

4

1 回答 1

5

好的,你从来没有真正改变 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;
}

注意:我没有测试过这个

于 2011-09-15T19:04:57.267 回答