Что на самом деле происходит, когда setText () вызывается для EditText? - PullRequest
0 голосов
/ 13 ноября 2018

Это часть кода:

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 голосов
/ 13 ноября 2018

Вы присвоили editText.getText() переменной.Это означает, что его значение не изменится.

Когда вы вызываете setText(), исходный текст перезаписывается новым CharSequence;исходный экземпляр Editable, который возвращает getText(), больше не является частью TextView, поэтому ваша переменная editable больше не присоединяется к TextView.

Посмотрите на TextView's 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это означает, что ваш редактируемый экземпляр больше не является экземпляром, имеющимся у EditText.

TextView.java

...