在 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 所具有的实例。
这是部分代码:
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 所具有的实例。