스팬 된 개체 두 개가 같은지 (동일한 콘텐츠와 스팬이 적용되었는지) 어떻게 확인할 수 있습니까? 오히려 equals(Spanned span)
메소드를 구현하지 않습니다. :)Android가 스팬 된 개체가 같은지 확인합니다.
3
A
답변
2
Android의 스팬 클래스는 equals
및 hashCode
메서드가 없습니다. 나는 이유를 모른다. 어쩌면 그냥 감시 였을까요? SpannableStringBuilder.equals()
메소드에 버그가 있습니다.
해결 방법은 사용자가 두려워했던 것입니다. 예를 들어 AbsoluteSizeSpan
을 사용하는 경우이를 확장하고 equals
및 hashCode
개의 메소드를 추가해야합니다. SpannableStringBuilder
에 스팬을 추가 할 때 프레임 워크의 버전 대신 버전을 사용하여 안드로이드 프레임 워크의 SpannableStringBuilder.equals()
방법에서
import android.os.Parcel;
public class AbsoluteSizeSpan extends android.text.style.AbsoluteSizeSpan {
public AbsoluteSizeSpan(int size) {
super(size);
}
public AbsoluteSizeSpan(int size, boolean dip) {
super(size, dip);
}
public AbsoluteSizeSpan(Parcel src) {
super(src);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbsoluteSizeSpan that = (AbsoluteSizeSpan) o;
if (getSize() != that.getSize()) return false;
return getDip() == that.getDip();
}
@Override
public int hashCode() {
int result = getSize();
result = 31 * result + (getDip() ? 1 : 0);
return result;
}
}
, 정렬되지 않은 스팬의 목록과 비교에 분류 스팬의 목록을. 이 문제를 해결하려면, SpannableStringBuilder.equals()
를 오버라이드 (override) :
public class SpannableStringBuilder extends android.text.SpannableStringBuilder {
@Override
public boolean equals(Object o) {
if (o instanceof Spanned &&
toString().equals(o.toString())) {
Spanned other = (Spanned) o;
// Check span data
Object[] otherSpans = other.getSpans(0, other.length(), Object.class);
Object[] spans = getSpans(0, length(), Object.class);
if (spans.length == otherSpans.length) {
for (int i = 0; i < spans.length; ++i) {
Object thisSpan = spans[i];
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;
}
}
이 SpannableStringBuilder
의 버전에 스팬 클래스의 재정의 (override) 버전을 추가합니다.