2017-01-11 4 views
1

Ниже утилита класс, чтобы сделать spannable строки с требуемым форматированиемspannableStringBuilder не работает с несколько пролетом в одном текстовом

package impressico.com.testfragmentstack; 

import android.content.Context; 
import android.support.v4.content.ContextCompat; 
import android.text.Spannable; 
import android.text.SpannableStringBuilder; 
import android.text.style.ForegroundColorSpan; 
import android.text.style.RelativeSizeSpan; 
import java.util.ArrayList; 
import java.util.List; 

public class SimpleSpanBuilder { 
    public static final int FORMATTING_STYLE_DARK_BOLD = 1; 
    public static final int FORMATTING_STYLE_DARK_BOLD_SMALL = 2; 
    public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT = 3; 
    public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL = 4; 
    private List<SpanSection> spanSections; 
    private StringBuilder stringBuilder; 
    ForegroundColorSpan boldColorSpan; 
    ForegroundColorSpan dimColorSpan; 
    ForegroundColorSpan testColorSpan1; 
    ForegroundColorSpan testColorSpan2; 
    RelativeSizeSpan relativeSmallSpan; 

    public SimpleSpanBuilder(Context context) { 
    stringBuilder = new StringBuilder(); 
    spanSections = new ArrayList<>(); 
    boldColorSpan = 
     new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Green)); 
    dimColorSpan = 
     new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Blue)); 
    testColorSpan1 = 
     new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Black)); 
    testColorSpan2 = 
     new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Red)); 
    relativeSmallSpan = new RelativeSizeSpan(0.8f); 
    } 

    public SimpleSpanBuilder append(String text, int formattingStyle) { 
    spanSections.add(new SpanSection(text, stringBuilder.length(), formattingStyle)); 
    stringBuilder.append(text); 
    return this; 
    } 

    public SpannableStringBuilder build() { 
    SpannableStringBuilder ssb = new SpannableStringBuilder(stringBuilder.toString()); 
    for (SpanSection section : spanSections) { 
     section.apply(ssb); 
    } 
    return ssb; 
    } 

    @Override 
    public String toString() { 
    return stringBuilder.toString(); 
    } 

    private class SpanSection { 
    private final String text; 
    private final int startIndex; 
    private final int formattingStyle; 

    public SpanSection(String text, int startIndex, int formattingStyle) { 
     this.formattingStyle = formattingStyle; 
     this.text = text; 
     this.startIndex = startIndex; 
    } 

    public void apply(SpannableStringBuilder spanStringBuilder) { 
     if (spanStringBuilder == null) return; 
     switch (formattingStyle) { 
     case FORMATTING_STYLE_DARK_BOLD: 
      spanStringBuilder.setSpan(boldColorSpan, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      break; 
     case FORMATTING_STYLE_DARK_BOLD_SMALL: 
      spanStringBuilder.setSpan(testColorSpan1, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      break; 
     case FORMATTING_STYLE_DIM_ITALIC_LIGHT: 
      spanStringBuilder.setSpan(dimColorSpan, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      break; 
     case FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL: 
      spanStringBuilder.setSpan(testColorSpan2, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      break; 
     } 
    } 
    } 
} 

Когда я пытаюсь применить форматирование на пролет ниже вызывающий код его не работает, как ожидаемый

tv=((TextView) view.findViewById(R.id.fragment_title)); 
    SimpleSpanBuilder ssbTest=new SimpleSpanBuilder(getContext()); 
    ssbTest.append("Green",1); 
    ssbTest.append("Black",2); 
    ssbTest.append("Blue",3); 
    ssbTest.append("Red",4); 
    ssbTest.append("Green",1); 
    ssbTest.append("Black",2); 
    ssbTest.append("Blue",3); 
    ssbTest.append("Red",4); 
    tv.setText(ssbTest.build()); 

enter image description here

кто-то пожалуйста, помогите мне, чтобы выяснить, что случилось в этом или его ошибка, из spannable ул ING/TextView?

Обновление Благодаря @TdSoft для решения и @WKS здесь причина, чтобы расширить ваш код

case FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL: { 
      CalligraphyTypefaceSpan typefaceSemiBoldItalic = new CalligraphyTypefaceSpan(typefaceSBI); 
      ForegroundColorSpan dimColorSpan = 
       new ForegroundColorSpan(ContextCompat.getColor(context, R.color.text_color_ffa7acb3)); 
      RelativeSizeSpan relativeSmallSpan = new RelativeSizeSpan(0.8f); 
      spanStringBuilder.setSpan(typefaceSemiBoldItalic, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      spanStringBuilder.setSpan(dimColorSpan, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
      spanStringBuilder.setSpan(relativeSmallSpan, startIndex, startIndex + text.length(), 
       Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
     } 
     break; 

У меня есть требование фиксированного набора стиля форматирования, выше кода вызывается во многих местах поэтому лучше показать код форматирования вызывающим абонентам.

ответ

2

Я просто изменить свой класс Utility немного смотрите ниже:

public class SimpleSpanBuilder { 
    public static final int FORMATTING_STYLE_DARK_BOLD = 1; 
    public static final int FORMATTING_STYLE_DARK_BOLD_SMALL = 2; 
    public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT = 3; 
    public static final int FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL = 4; 
    private List<SpanSection> spanSections; 
    private StringBuilder stringBuilder; 
    RelativeSizeSpan relativeSmallSpan; 
    private Context context; 
    public SimpleSpanBuilder(Context context) { 
     this.context = context; 
     stringBuilder = new StringBuilder(); 
     spanSections = new ArrayList<>(); 
     relativeSmallSpan = new RelativeSizeSpan(0.8f); 
    } 

    public SimpleSpanBuilder append(String text, int formattingStyle) { 
     spanSections.add(new SpanSection(text, stringBuilder.length(), formattingStyle)); 
     stringBuilder.append(text); 
     return this; 
    } 

    public SpannableStringBuilder build() { 
     SpannableStringBuilder ssb = new SpannableStringBuilder(stringBuilder.toString()); 
     for (SpanSection section : spanSections) { 
      section.apply(ssb); 
     } 
     return ssb; 
    } 

    @Override 
    public String toString() { 
     return stringBuilder.toString(); 
    } 

    private class SpanSection { 
     private final String text; 
     private final int startIndex; 
     private final int formattingStyle; 

     public SpanSection(String text, int startIndex, int formattingStyle) { 
      this.formattingStyle = formattingStyle; 
      this.text = text; 
      this.startIndex = startIndex; 
     } 

     public void apply(SpannableStringBuilder spanStringBuilder) { 
      if (spanStringBuilder == null) return; 
      switch (formattingStyle) { 
       case FORMATTING_STYLE_DARK_BOLD: 
        ForegroundColorSpan boldColorSpan = 
          new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Green)); 
        spanStringBuilder.setSpan(boldColorSpan, startIndex, startIndex + text.length(), 
          Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
        break; 
       case FORMATTING_STYLE_DARK_BOLD_SMALL: 
        ForegroundColorSpan testColorSpan1 = 
          new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Black)); 

        spanStringBuilder.setSpan(testColorSpan1, startIndex, startIndex + text.length(), 
          Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
        break; 
       case FORMATTING_STYLE_DIM_ITALIC_LIGHT: 
        ForegroundColorSpan dimColorSpan = 
          new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Blue)); 
        spanStringBuilder.setSpan(dimColorSpan, startIndex, startIndex + text.length(), 
          Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
        break; 
       case FORMATTING_STYLE_DIM_ITALIC_LIGHT_SMALL: 
        ForegroundColorSpan testColorSpan2 = 
          new ForegroundColorSpan(ContextCompat.getColor(context, R.color.Red)); 
        spanStringBuilder.setSpan(testColorSpan2, startIndex, startIndex + text.length(), 
          Spannable.SPAN_INCLUSIVE_EXCLUSIVE); 
        break; 
      } 
     } 
    } 
} 

Примечание: Для relativeSmallSpan также сделать то же самое, то он также будет работать нормально. Попробуйте это и дайте нам знать ... Gud удачи

+0

его работает нормально, это означает, что мы не можем повторно использовать экземпляр стиля форматирования дважды во время сборки SpannableString, не так ли? – RQube

+1

@RQube да, это правильно ... :) – TdSoft

0

Я написал SimpleSpanBuilder класс в this ответ. Вы расширили класс и сделали его излишне сложным. Это довольно просто:

SimpleSpanBuilder ssbTest = new SimpleSpanBuilder(); 

ssbTest.append("Green",new ForegroundColorSpan(Color.GREEN)); 
ssbTest.append("Black",new ForegroundColorSpan(Color.BLACK)); 
ssbTest.append("Blue",new ForegroundColorSpan(Color.BLUE)); 
ssbTest.append("Red",new ForegroundColorSpan(Color.RED)); 

ssbTest.append("Green",new ForegroundColorSpan(Color.GREEN)); 
ssbTest.append("Black",new ForegroundColorSpan(Color.BLACK)); 
ssbTest.append("Blue",new ForegroundColorSpan(Color.BLUE)); 
ssbTest.append("Red",new ForegroundColorSpan(Color.RED)); 


textView.setText(ssbTest.build()); 

UPDATE

Я не проверял этот код, но объявить именованный стиль, вы могли бы сделать что-то вроде:

public static class SpanStyleSheet{ 

    private static ParcelableSpan[] dimItalicLightSmall; 

    public static ParcelableSpan[] dimItalicLightSmall(Context context){ 

     if(dimItalicLightSmall == null){ 
      dimItalicLightSmall = new ParcellableSpan[]{ 
       new CalligraphyTypefaceSpan(typefaceSBI), 
       new ForegroundColorSpan(ContextCompat.getColor(context, R.color.text_color_ffa7acb3)), 
       new RelativeSizeSpan(0.8f) 
      } 
     } 
     return dimItalicLightSmall; 
    } 
} 

SimpleSpanBuilder ssbTest = new SimpleSpanBuilder(); 
ssbTest.append("Green",SpanStyleSheet.dimItalicLightSmall(getContext())); 
textView.setText(ssbTest.build()); 
+0

спасибо за ваш код, вы правы, я расширил это согласно моему требованию, и это не лишнее, в основном я хочу разоблачить эту утилиту в приложении с фиксированным набором форматирования, вызывающий эта утилита просто передаст код, например FORMATTING_STYLE_DIM_ITALIC_LIGHT, здесь в зависимости от утилиты кода может применяться один или несколько интервалов стиля в этом разделе. – RQube

+0

Я обновил вопрос одним вариантом использования, проверьте. – RQube

Смежные вопросы