问题描述
请考虑以下测试:
@Test
fun test() {
val s1 = SpannableString("Test")
val s2 = SpannableString("Test")
s1.setSpan(StyleSpan(BOLD),s1.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
s2.setSpan(StyleSpan(BOLD),s2.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
assertEquals(s1,s2)
}
它成功还是失败?
我的假设是它应该成功,但是失败(抓挠头)。在查看SpannableStringInternal
的实现时,我们看到该函数将每个范围与其对应范围进行比较(假设我们具有相等数量的范围)。
// Same as SpannableStringBuilder
@Override
public boolean equals(Object o) {
if (o instanceof Spanned &&
toString().equals(o.toString())) {
final Spanned other = (Spanned) o;
// Check span data
final Object[] otherSpans = other.getSpans(0,other.length(),Object.class);
final Object[] thisSpans = getSpans(0,length(),Object.class);
if (mSpanCount == otherSpans.length) {
for (int i = 0; i < mSpanCount; ++i) {
final Object thisSpan = thisSpans[i];
final Object otherSpan = otherSpans[i];
if (thisSpan == this) {
if (other != otherSpan ||
getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
return false;
}
} else if (!thisSpan.equals(otherSpan) ||
getSpanStart(thisSpan) != other.getSpanStart(otherSpan) ||
getSpanEnd(thisSpan) != other.getSpanEnd(otherSpan) ||
getSpanFlags(thisSpan) != other.getSpanFlags(otherSpan)) {
return false;
}
}
return true;
}
}
return false;
}
else if
中的第一个条件比较了Span对象是否相等,并且样式跨度(尽管编码相同的数据且类型相同)不相等,因为看起来StyleSpan
确实不覆盖等于。
为什么没有将这两者视为相等的特定原因,或者这是Android中的错误?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)