TextView的append()方法如何调用SpannableStringBuilder的replace()方法
How does TextView's append() method call the replace() method of SpannableStringBuilder
我有这个习惯SpannableStringBuilder
class:
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
中被调用并设置它的所有参数。我不明白TextView
的append()
方法是怎么调用SpannableStringBuilder
的replace()
方法的,它的参数是怎么设置的。我搜索了文档,但没有找到任何解释。
任何帮助,请。谢谢。
如果您查看 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()
.
的调用
我有这个习惯SpannableStringBuilder
class:
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
中被调用并设置它的所有参数。我不明白TextView
的append()
方法是怎么调用SpannableStringBuilder
的replace()
方法的,它的参数是怎么设置的。我搜索了文档,但没有找到任何解释。
任何帮助,请。谢谢。
如果您查看 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()
.