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才能将TextView转换为Editable所需的SpannableStringBuilder

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方法,并设置所有参数。我不了解append()的{​​{1}}方法如何调用TextView的{​​{1}}方法以及如何设置其参数。我搜索了文档,但没有找到任何解释。 请帮忙。谢谢。

解决方法

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

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

因此,似乎在 TextView 上调用append()确实会导致在后台调用replace()

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

textView.append("123")

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

enter image description here

SpannableStringBuilder

第291行位于append()方法中,其内容为:

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...