问题描述
我有这个自定义的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")
我们可以看到进行了以下调用:
SpannableStringBuilder 的第291行位于append()
方法中,其内容为:
// Documentation from interface
public SpannableStringBuilder append(CharSequence text,int end) {
int length = length();
return replace(length,length,end);
}
在这里我们看到对append()
的调用导致对replace()
的调用。