Android TextView富文本设置工具封装

在对一个TextView设置文字是,我们可能要根据需求,让一段文字中部分字体变大,部分加粗、飘红,还有要求有删除线(商品原价)

我封装的这个类,通过传入一个List<HashMap<String,Object>> 来定制所需要的富文本,list中每个hashmap代表按顺序的一段文本,每个hashmap里必须有“string”这个key,其他的"color","size","relativeSize","delete"都是可选的,没有的话就和控件原来的设置一致。
其中
"color"表示颜色,
"size"表示绝对大小px,
"relativeSize"表示相对于控件设置的字体大小的倍数,
"delete"表示删除线。
还有一些如下划线,斜体等读者也可轻松自行加上

源代码

import java.util.HashMap;
import java.util.List;

import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;

public class RichTextUtil {

    public static final String RICHTEXT_STRING = "string";
    public static final String RICHTEXT_COLOR = "color";
    public static final String RICHTEXT_SIZE = "size";
    public static final String RICHTEXT_RSIZE = "relativesize";
    public static final String RICHTEXT_DELETE = "delete";


    /**
     * 根据传入的hashmaplist组成富文本返回,key在RichTextUtil里
     * @param list
     * @return
     */
    public static SpannableStringBuilder getSpannableStringFromList(List<HashMap<String,Object>> list){

        SpannableStringBuilder ssb = new SpannableStringBuilder("");
        int position = 0;
        for (int i=0;i<list.size();i++){
            HashMap<String,Object> map = list.get(i);
            try{
                String st = (String)map.get(RICHTEXT_STRING);
                ssb.append(st);
                int len = st.length();

                if (map.containsKey(RICHTEXT_COLOR)){
                    int color = ((Integer)map.get(RICHTEXT_COLOR)).intValue();
                    ssb.setSpan(new ForegroundColorSpan(color), position, position+len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                }

                if (map.containsKey(RICHTEXT_SIZE)){
                    int size = ((Integer)map.get(RICHTEXT_SIZE)).intValue();
                    ssb.setSpan(new AbsoluteSizeSpan(size), position, position+len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }

                if (map.containsKey(RICHTEXT_RSIZE)){
                    float size = ((Float)map.get(RICHTEXT_RSIZE)).floatValue();
                    ssb.setSpan(new RelativeSizeSpan(size), position, position+len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                }

                if (map.containsKey(RICHTEXT_DELETE)){
                     ssb.setSpan(new StrikethroughSpan(),position, position+len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
                }

//              android.text.style.RelativeSizeSpan
                position = position+len;

            } catch(Exception e){
                return null;
            }

        }

        return ssb;
    }
}

使用示例如下

    List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
    HashMap<String, Object> map;
    map = new HashMap<String, Object>();
    map.put(RichTextUtil.RICHTEXT_STRING, "第1部分正常");
    list.add(map);

    map = new HashMap<String, Object>();
    map.put(RichTextUtil.RICHTEXT_STRING, "第2部分红色");
    map.put(RichTextUtil.RICHTEXT_COLOR, new Integer(Color.RED));
    list.add(map);

    map = new HashMap<String, Object>();
    map.put(RichTextUtil.RICHTEXT_STRING, "第3部分30号字");
    map.put(RichTextUtil.RICHTEXT_SIZE, new Integer(30));
    list.add(map);

    map = new HashMap<String, Object>();
    map.put(RichTextUtil.RICHTEXT_STRING, "第4部分蓝色加大35");
    map.put(RichTextUtil.RICHTEXT_COLOR, new Integer(Color.BLUE));
    map.put(RichTextUtil.RICHTEXT_SIZE, new Integer(35));
    list.add(map);

    tv.setText(RichTextUtil.getSpannableStringFromList(list));

关于SpannableString 可以参考 参考博客1,SpannableStringBuilder 和SpannableString的关系和String与StringBuffer关系基本一致


文章为原创,转载请注明出处。


小猪
114 声望4 粉丝