2013-10-17 12 views

답변

2

Android의 스팬 클래스는 equalshashCode 메서드가 없습니다. 나는 이유를 모른다. 어쩌면 그냥 감시 였을까요? SpannableStringBuilder.equals() 메소드에 버그가 있습니다.

해결 방법은 사용자가 두려워했던 것입니다. 예를 들어 AbsoluteSizeSpan을 사용하는 경우이를 확장하고 equalshashCode 개의 메소드를 추가해야합니다. 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) 버전을 추가합니다.