2016-03-30 10 views
0

私はthisStyleSpanRemoverを使用して選択したテキストからスタイルを削除しましたが、問題があります。 選択したテキストの太字スタイルを切り替えるボタンをboldにしたいとします。選択されたテキスト(またはその一部)が太字ではなく、すべて太字である場合は意味します。選択したテキストのすべてが太字である場合は、太字のスタイルを削除します。私は1つのテキストをボールドスタイルを削除した後に、このコードを使用して、もう一度それを太字とき はしかし、getStyle()はいつもここでTypeface.NORMALスパンのスタイルを削除

を返す私が使用しているコードです:多くの試行の後

boolean isAllSpansBold = true; 

     /** 
     * Bold selected text 
     */ 
     Spannable spannable = new SpannableString(mEditTextContent.getText()); 

     StyleSpan[] styleSpans = mEditTextContent.getText().getSpans(
       mEditTextContent.getSelectionStart(), 
       mEditTextContent.getSelectionEnd(), 
       StyleSpan.class 
     ); 


     if(styleSpans.length == 0) 
     { 
      spannable.setSpan(
        new StyleSpan(Typeface.BOLD), 
        mEditTextContent.getSelectionStart(), 
        mEditTextContent.getSelectionEnd(), 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 

      Log.d("Ramansoft", "styleSpans.length = 0"); 
     } 
     else 
     { 
      for(int i=0; i<styleSpans.length; i++) { 
       Log.d("Ramansoft", "The style is: " + String.valueOf(styleSpans[i].getStyle())); 

       if (styleSpans[i].getStyle() != Typeface.BOLD && styleSpans[i].getStyle() != Typeface.BOLD_ITALIC) { 
        isAllSpansBold = false; 
        break; 
       } 
      } 

      if(isAllSpansBold) 
      { 
       StyleSpanRemover styleSpanRemover = new StyleSpanRemover(); 
       styleSpanRemover.RemoveStyle(
         spannable, 
         mEditTextContent.getSelectionStart(), 
         mEditTextContent.getSelectionEnd(), 
         Typeface.BOLD 
       ); 

       Log.d("Ramansoft", "isAllSpansBold = true"); 
      } 
      else 
      { 
       spannable.setSpan(
         new StyleSpan(Typeface.BOLD), 
         mEditTextContent.getSelectionStart(), 
         mEditTextContent.getSelectionEnd(), 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 

       Log.d("Ramansoft", "isAllSpansBold = false"); 
      } 

答えて

0

、私はそれを行うことができます。 Hereが解決策です。

public class SpanStyleHelper 
{ 
protected EditText mEditText; 
protected Spannable mSpannable; 
protected int mSelectedTextStart; 
protected int mSelectedTextEnd; 

public SpanStyleHelper(EditText editText) 
{ 
    mEditText = editText; 
    mSpannable = mEditText.getText(); 
    mSelectedTextStart = mEditText.getSelectionStart(); 
    mSelectedTextEnd = mEditText.getSelectionEnd(); 
} 

public Spannable boldSelectedText() 
{ 
    Log.d("Ramansoft", "Try to bold selected text.."); 

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 

    if(styleSpans.length > 0) { 

     int lastSpanEnd = 0; 

     for (StyleSpan styleSpan : styleSpans) { 
      /** 
      * Save old style 
      */ 
      int oldStyle = styleSpan.getStyle(); 


      /** 
      * Get start and end of span 
      */ 
      int spanStart = mSpannable.getSpanStart(styleSpan); 
      int spanEnd = mSpannable.getSpanEnd(styleSpan); 


      /** 
      * Before bold this span, we check if any unspanned 
      * text between this span and last span remains. if any 
      * unspanned text exist, we should bold it 
      */ 
      if(spanStart > lastSpanEnd) 
      { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.BOLD), 
         lastSpanEnd, 
         spanStart, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 

      /** 
      * Update last span end 
      */ 
      lastSpanEnd = spanEnd; 


      /** 
      * Remove the span 
      */ 
      mSpannable.removeSpan(styleSpan); 


      /** 
      * Because we just need change selected text, 
      * if span start is lower than selected text start or 
      * if span end is higher than selected text end start 
      * we should restore span for unselected part of span 
      */ 
      if (spanStart < mEditText.getSelectionStart()) { 
       mSpannable.setSpan(
         new StyleSpan(oldStyle), 
         spanStart, 
         mSelectedTextStart, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 

      if (spanEnd > mEditText.getSelectionEnd()) { 
       mSpannable.setSpan(
         new StyleSpan(oldStyle), 
         mSelectedTextEnd, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 

      /** 
      * We want to add bold style to current style 
      * so we most detect current style and change 
      * the style depend on current style 
      */ 
      if (oldStyle == Typeface.ITALIC) { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.BOLD_ITALIC), 
         spanStart, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } else { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.BOLD), 
         spanStart, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 
     } 

     /** 
     * Now we should check if any 
     * unspanned selected text remains 
     */ 
     if(mSelectedTextEnd != lastSpanEnd) 
     { 
      mSpannable.setSpan(
        new StyleSpan(Typeface.BOLD), 
        lastSpanEnd, 
        mSelectedTextEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 
    } 
    else 
    { 
     mSpannable.setSpan(
       new StyleSpan(Typeface.BOLD), 
       mSelectedTextStart, 
       mSelectedTextEnd, 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
     ); 
    } 

    return mSpannable; 
} 

public Spannable unBoldSelectedText() 
{ 
    Log.d("Ramansoft", "Try to unbold selected text.."); 

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 

    for(StyleSpan styleSpan:styleSpans) 
    { 
     /** 
     * Save old style 
     */ 
     int oldStyle = styleSpan.getStyle(); 


     /** 
     * Get start and end of span 
     */ 
     int spanStart = mSpannable.getSpanStart(styleSpan); 
     int spanEnd = mSpannable.getSpanEnd(styleSpan); 


     /** 
     * Remove the span 
     */ 
     mSpannable.removeSpan(styleSpan); 


     /** 
     * Because we just need change selected text, 
     * if span start is lower than selected text start or 
     * if span end is higher than selected text end start 
     * we should restore span for unselected part of span 
     */ 
     if(spanStart < mEditText.getSelectionStart()) 
     { 
      mSpannable.setSpan(
        new StyleSpan(oldStyle), 
        spanStart, 
        mSelectedTextStart, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 

     if(spanEnd > mEditText.getSelectionEnd()) 
     { 
      mSpannable.setSpan(
        new StyleSpan(oldStyle), 
        mSelectedTextEnd, 
        spanEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 

     /** 
     * Because we just want to remove bold style, 
     * if the span has another style, we should restore it 
     */ 
     if(oldStyle == Typeface.BOLD_ITALIC) 
     { 
      mSpannable.setSpan(
        new StyleSpan(Typeface.ITALIC), 
        spanStart, 
        spanEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 
    } 

    return mSpannable; 
} 

public Spannable toggleBoldSelectedText() 
{ 
    Log.d("Ramansoft", "Try to toggle bold selected text.."); 

    boolean isAllSpansBold = true; 


    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 


    if(styleSpans.length == 0) 
    { 
     return boldSelectedText(); 
    } 
    else 
    { 
     for(StyleSpan styleSpan:styleSpans) 
     { 
      Log.d("Ramansoft", "styleSpan.getStyle() = " + styleSpan.getStyle()); 

      if (styleSpan.getStyle() != Typeface.BOLD && styleSpan.getStyle() != Typeface.BOLD_ITALIC) { 
       isAllSpansBold = false; 
       break; 
      } 
     } 

     Log.d("Ramansoft", "isAllSpansBold = " + isAllSpansBold); 


     if(isAllSpansBold) 
      return unBoldSelectedText(); 
     else 
      return boldSelectedText(); 
    } 

} 

public Spannable italicSelectedText() 
{ 
    Log.d("Ramansoft", "Try to italic selected text.."); 

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 

    if(styleSpans.length > 0) 
    { 
     int lastSpanEnd = 0; 

     for (StyleSpan styleSpan : styleSpans) { 
      /** 
      * Save old style 
      */ 
      int oldStyle = styleSpan.getStyle(); 


      /** 
      * Get start and end of span 
      */ 
      int spanStart = mSpannable.getSpanStart(styleSpan); 
      int spanEnd = mSpannable.getSpanEnd(styleSpan); 


      /** 
      * Before italic this span, we check if any unspanned 
      * text between this span and last span remains. if any 
      * unspanned text exist, we should italic it 
      */ 
      if(spanStart > lastSpanEnd) 
      { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.ITALIC), 
         lastSpanEnd, 
         spanStart, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 


      /** 
      * Update last span end 
      */ 
      lastSpanEnd = spanEnd; 


      /** 
      * Remove the span 
      */ 
      mSpannable.removeSpan(styleSpan); 


      /** 
      * Because we just need change selected text, 
      * if span start is lower than selected text start or 
      * if span end is higher than selected text end start 
      * we should restore span for unselected part of span 
      */ 
      if (spanStart < mEditText.getSelectionStart()) { 
       mSpannable.setSpan(
         new StyleSpan(oldStyle), 
         spanStart, 
         mSelectedTextStart, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 

      if (spanEnd > mEditText.getSelectionEnd()) { 
       mSpannable.setSpan(
         new StyleSpan(oldStyle), 
         mSelectedTextEnd, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 

      /** 
      * We want to add bold style to current style 
      * so we most detect current style and change 
      * the style depend on current style 
      */ 
      if (oldStyle == Typeface.BOLD) { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.BOLD_ITALIC), 
         spanStart, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } else { 
       mSpannable.setSpan(
         new StyleSpan(Typeface.ITALIC), 
         spanStart, 
         spanEnd, 
         Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
       ); 
      } 
     } 

     /** 
     * Now we should check if any 
     * unspanned selected text remains 
     */ 
     if(mSelectedTextEnd != lastSpanEnd) 
     { 
      mSpannable.setSpan(
        new StyleSpan(Typeface.ITALIC), 
        lastSpanEnd, 
        mSelectedTextEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 
    } 
    else 
    { 
     mSpannable.setSpan(
       new StyleSpan(Typeface.ITALIC), 
       mSelectedTextStart, 
       mSelectedTextEnd, 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
     ); 
    } 

    return mSpannable; 
} 

public Spannable unItalicSelectedText() 
{ 
    Log.d("Ramansoft", "Try to un-italic selected text.."); 

    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 

    for(StyleSpan styleSpan:styleSpans) 
    { 
     /** 
     * Save old style 
     */ 
     int oldStyle = styleSpan.getStyle(); 


     /** 
     * Get start and end of span 
     */ 
     int spanStart = mSpannable.getSpanStart(styleSpan); 
     int spanEnd = mSpannable.getSpanEnd(styleSpan); 


     /** 
     * Remove the span 
     */ 
     mSpannable.removeSpan(styleSpan); 


     /** 
     * Because we just need change selected text, 
     * if span start is lower than selected text start or 
     * if span end is higher than selected text end start 
     * we should restore span for unselected part of span 
     */ 
     if(spanStart < mEditText.getSelectionStart()) 
     { 
      mSpannable.setSpan(
        new StyleSpan(oldStyle), 
        spanStart, 
        mSelectedTextStart, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 

     if(spanEnd > mEditText.getSelectionEnd()) 
     { 
      mSpannable.setSpan(
        new StyleSpan(oldStyle), 
        mSelectedTextEnd, 
        spanEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 

     /** 
     * Because we just want to remove bold style, 
     * if the span has another style, we should restore it 
     */ 
     if(oldStyle == Typeface.BOLD_ITALIC) 
     { 
      mSpannable.setSpan(
        new StyleSpan(Typeface.BOLD), 
        spanStart, 
        spanEnd, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
      ); 
     } 
    } 

    return mSpannable; 
} 

public Spannable toggleItalicSelectedText() 
{ 
    Log.d("Ramansoft", "Try to toggle italic selected text.."); 

    boolean isAllSpansItalic = true; 


    StyleSpan[] styleSpans = mEditText.getText().getSpans(
      mSelectedTextStart, 
      mSelectedTextEnd, 
      StyleSpan.class 
    ); 


    if(styleSpans.length == 0) 
    { 
     return italicSelectedText(); 
    } 
    else 
    { 
     for(StyleSpan styleSpan:styleSpans) 
     { 
      Log.d("Ramansoft", "styleSpan.getStyle() = " + styleSpan.getStyle()); 

      if (styleSpan.getStyle() != Typeface.ITALIC && styleSpan.getStyle() != Typeface.BOLD_ITALIC) { 
       isAllSpansItalic = false; 
       break; 
      } 
     } 

     Log.d("Ramansoft", "isAllSpansItalic = " + isAllSpansItalic); 


     if(isAllSpansItalic) 
      return unItalicSelectedText(); 
     else 
      return italicSelectedText(); 
    } 
} 
} 
関連する問題