首页 > 解决方案 > TextView的append()方法如何调用SpannableStringBuilder的replace()方法

问题描述

我有这个自定义SpannableStringBuilder类:

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需要将 aTextView转换为Editable所需的a SpannableStringBuilder

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

然后附加TextViewEditable.Factory

myTextView.setEditableFactory(editableFactory);

上面的代码基本上所做的是,每当一个新的字符串附加到 中时,都会在中调用TextView该方法并设置其所有参数。我不明白方法的方法是如何调用的方法以及它的参数是如何设置的。我搜索了文档,但没有找到任何解释。任何帮助,请。谢谢。replace()ExpressionBuilderappend()TextViewreplace()SpannableStringBuilder

标签: androidtextviewspannablestringbuilder

解决方案


如果您查看可编辑界面,您将看到以下内容:

/**
 * 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);

因此,看起来append()TextView的调用确实会导致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()


推荐阅读