Android检查跨对象是否相等

Tud*_*uca 6 android spanned spannable

如何检查两个Spanned对象是否相等(它们具有相同的内容和跨度)?我宁愿不执行该equals(Spanned span)方法。:)

ale*_*ett 6

Android中缺少span类equalshashCode方法。我不知道为什么。也许这只是一个疏忽?该SpannableStringBuilder.equals()方法还存在一个错误。

解决方法正是您所担心的。例如,如果使用,AbsoluteSizeSpan则需要扩展它并添加equalshashCode方法。将 span 添加到时,使用您的版本而不是框架的版本SpannableStringBuilder

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Android 框架的SpannableStringBuilder.equals()方法中,将已排序的 Span 列表与未排序的 Span 列表进行比较。要解决此问题,请覆盖SpannableStringBuilder.equals()

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

将跨度类的覆盖版本添加到您的SpannableStringBuilder.

  • 我不明白。为什么 Android 框架不提供比较 SpannableStrings 的正确方法?我只想安静地写一些单元测试,而不是流这么多眼泪...... (4认同)