在EditText上调用setText()时,真正发生了什么?

时间:2018-11-13 15:33:10

标签: android android-edittext textview android-editable

这是代码的一部分:

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()的值没有改变?谢谢

1 个答案:

答案 0 :(得分:2)

您为变量分配了editText.getText()。这意味着它的价值不会改变。

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

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

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

如果mText是可编辑对象,则它将返回它。否则,它将返回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