TextView的append()方法如何调用SpannableStringBuilder的replace()方法

How does TextView's append() method call the replace() method of SpannableStringBuilder

我有这个习惯SpannableStringBuilderclass:

public class ExpressionBuilder extends SpannableStringBuilder{

    public ExpressionBuilder(CharSequence text){
         super(text);
    }

    @Override
    public SpannableStringBuilder replace(int start, int end, CharSequence tb, int tbstart,
                                      int tbend) {
        // do something...
    }

}

并且 Editable.Factory 需要将 TextView 转换为 SpannableStringBuilder 所需的 Editable:

private final Editable.Factory editableFactory = new Editable.Factory() {
    @Override
    public Editable newEditable(CharSequence source) {
        return new ExpressionBuilder(source);
    }
};

然后将 TextView 附加到 Editable.Factory:

myTextView.setEditableFactory(editableFactory);

上面的代码基本上是做什么的,每当一个新字符串附加到 TextView 时,replace() 方法就会在 ExpressionBuilder 中被调用并设置它的所有参数。我不明白TextViewappend()方法是怎么调用SpannableStringBuilderreplace()方法的,它的参数是怎么设置的。我搜索了文档,但没有找到任何解释。 任何帮助,请。谢谢。

如果您查看 Editable Inteface,您将看到以下内容:

/**
 * Convenience for replace(length(), length(), text, 0, text.length())
 * @see #replace(int, int, CharSequence, int, int)
 */
public Editable append(CharSequence text);
/**
 * Convenience for replace(length(), length(), text, start, end)
 * @see #replace(int, int, CharSequence, int, int)
 */
public Editable append(CharSequence text, int start, int end);
/**
 * Convenience for append(String.valueOf(text)).
 * @see #replace(int, int, CharSequence, int, int)
 */
public Editable append(char text);

因此,看起来在 TextView 上调用 append() 确实会在幕后调用 replace()

如果我们通过在应用程序的onCreate()方法中执行以下代码来仔细观察

textView.append("123")

我们可以看到进行了以下调用链:

SpannableStringBuilder 的第 291 行在 append() 方法中,内容为:

// Documentation from interface
public SpannableStringBuilder append(CharSequence text, int start, int end) {
    int length = length();
    return replace(length, length, text, start, end);
}

这里我们看到对 append() 的调用导致对 replace().

的调用