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关系基本一致
文章为原创,转载请注明出处。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。