2011-01-12 3 views
1

spannableオブジェクトを3つマージします。このコードは正常に動作します:spannableオブジェクトをマージする際のエラー

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オブジェクトをマージするとき、結果が間違っています。 特定の要素のタイプが正しいことを確認しました。
beginOfModifiedSpannableは太字で、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つの部分があります:私は、最初のマージが右であることに気づいた ヘル見よ、WOR LD

を:それはヘル loのように見えます

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

、WOR

しかし、 2番目は間違っている

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

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

そして間違った文字列の結果は次のとおりです:または、このマージは間違っている、

ヘル LO:RLD

woは、 こんにちはしかし、真の結果は次のようでなければなりませんワールド

ナンセンス!

答えて

13

問題は、ほとんどの場合、第1と第3の両方の部分で同じCharacterStyleインスタンスを使用することです。 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); 

これは、あなたがこのような何かしなければならない、正しい結果を得るためにこんにちは、WOR 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

を!ありがとうございました! –

+0

CharacterStyle c2 = CharacterStyle.wrap(c)もジョブを実行します。 –

+1

これはバグのように見える、ありがとう、あなたは私の日を救った –

関連する問題