2011-01-12 40 views
1

我想合併3個可跨越對象。此代碼正常工作:合併可跨越對象時出錯

Spannable s1 = new SpannableStringBuilder("bold"); 
      s1.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, s1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      Spannable s2 = new SpannableStringBuilder("not"); 
      Spannable s3 = new SpannableStringBuilder("BOLD"); 
      s3.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0, s3.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      finishSpan = (Spanned) TextUtils.concat(s1,s2); 
      finishSpan = (Spanned) TextUtils.concat(finishSpan,s3); 

////////////////// ////////////////

finishSpan = (Spanned) TextUtils.concat(s1,s2,s3);

我有相同的代碼,但是當我合併3的對象,結果是錯的。 我檢查過某些元素的類型是否爲真。
beginningOfModifiedSpannable是粗體,selectionSpannable是正常的,endOfModifiedSpannable是粗體 但是它們的合併是錯誤的。只有結果字符串的最後一部分是粗體。爲什麼會發生?我有上面相同的代碼,它運作良好!

Spannable str = contentText.getText(); 
      Spannable selectionSpannable = new SpannableStringBuilder(str, selectionStart, selectionEnd); 
      StyleSpan[] ss = selectionSpannable.getSpans(0, selectionSpannable.length(), StyleSpan.class); 

      boolean exists = false; 
      for (int i = 0; i < ss.length; i++) { 
       if (ss[i].getStyle() == android.graphics.Typeface.BOLD){ 
       selectionSpannable.removeSpan(ss[i]); 
        exists = true; 
       } 
      } 

      if (!exists){ 
       str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      } 
      else { 

      Spannable endOfModifiedSpannable = new SpannableStringBuilder(str, selectionEnd, contentText.getText().length()); 
      Spannable beginningOfModifiedSpannable = new SpannableStringBuilder(str, 0, selectionStart); 
      Spanned finishSpan = null; 

      if(beginningOfModifiedSpannable.length() > 0) { 

       if(endOfModifiedSpannable.length() > 0) { 
       finishSpan = (Spanned) TextUtils.concat(beginningOfModifiedSpannable,selectionSpannable); 
       finishSpan = (Spanned) TextUtils.concat(finishSpan,endOfModifiedSpannable); 
       } 
       else { 
       finishSpan = (Spanned) TextUtils.concat(beginningOfModifiedSpannable,selectionSpannable); 
       } 

      } 
      else { 
       if(endOfModifiedSpannable.length() > 0) { 
       finishSpan = (Spanned) TextUtils.concat(selectionSpannable,endOfModifiedSpannable); 
        } 
        else { 
        finishSpan = selectionSpannable; 
        } 
       } 
contentText.setText(finishSpan); 

我再說一遍,我已經檢查了3個部分是真實的。例如。我有3個部分: 赫爾 LO,WOR LD

我已經注意到了,第一合併是正確的:

finishSpan = (Spanned) TextUtils.concat(beginningOfModifiedSpannable,selectionSpannable); 

它看起來像赫爾 LO,WOR

但第二個是錯的

finishSpan = (Spanned) TextUtils.concat(finishSpan,endOfModifiedSpannable); 

或者這個合併是錯誤的:

finishSpan = (Spanned) TextUtils.concat(finishSpan,selectionSpannable,endOfModifiedSpannable); 

與錯串的結果是: 你好,WO RLD

但真正的結果必然是這樣的:

赫爾 LO, 世界

廢話!

回答

13

問題是,你最有可能使用相同的CharacterStyle實例的兩部分,第1和第3。每次將樣式添加到Spannable對象時,都需要使用新實例。

例如

SpannableStringBuilder ssb = new SpannableStringBuilder("Hello,world"); 
    CharacterStyle c = new StyleSpan(Typeface.BOLD); 
    ssb.setSpan(c, 0, 3, 0); 
    ssb.setSpan(c, 9, 11, 0); 

這將導致進入你好,義和LD

得到一個正確的結果,你必須做這樣的事情:

SpannableStringBuilder ssb = new SpannableStringBuilder("Hello,world"); 
    CharacterStyle c = new StyleSpan(Typeface.BOLD); 
    CharacterStyle c2 = new StyleSpan(Typeface.BOLD); 
    ssb.setSpan(c, 0, 3, 0); 
    ssb.setSpan(c2, 9, 11, 0); 
+1

你是一個救星!謝謝! – 2013-09-11 16:00:31