在 EditText 上调用 setText() 时到底发生了什么?

What really happens when setText() is called on an EditText?

这是部分代码:

editText.setText("Some Text", TextView.BufferType.EDITABLE);

Editable editable = (Editable) editText.getText();

// value of editable.toString() here is "Some Text"

editText.setText("Another Text", TextView.BufferType.EDITABLE);

// value of editable.toString() is still "Some Text"

为什么 editable.toString() 的值没有改变?谢谢

您将 editText.getText() 分配给了一个变量。这意味着它的值不会改变。

调用setText()时,原来的文本被新的CharSequence覆盖; getText() returns 的 Editable 的原始实例不再是 TextView 的一部分,因此您的 editable 变量不再附加到 TextView。

看看TextView的getEditableText()(这是EditText从getText()调用的):

public Editable getEditableText() {
    return (mText instanceof Editable) ? (Editable) mText : null;
}

如果 mText 是一个可编辑对象,那么它将 return 它。否则,它将 return null.

setText() 最终进入 setTextInternal()

private void setTextInternal(@Nullable CharSequence text) {
    mText = text;
    mSpannable = (text instanceof Spannable) ? (Spannable) text : null;
    mPrecomputed = (text instanceof PrecomputedText) ? (PrecomputedText) text : null;
}

如您所见,它只是覆盖了 mText 字段,这意味着您的 Editable 实例不再是 EditText 所具有的实例。

TextView.java