SpannableStringBuilder实现图文混排

概述

SpannableString、SpannableStringBuilder与String的关系

SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但是它们俩的特殊就在于有一个setSpan()函数,能给这些存储的String添加各种样式(Span),将原来的String以不同的样式显示出来,比如在原来的String上加下划线丶加背景色丶改变字体颜色丶用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样,首先也是传字符串,但是SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行。
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。

SpannableString与SpannableStringBuilder区别

它们的区别在于SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String。
因为Spannable等最终都实现了CharSequence接口,所以可以直接SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。

SetSpan()

void setSpan (Object what, int start, int end, int flags)

函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。

参数说明:
object what :对应的各种Span;
int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。

基本使用

  • activity
package com.wangjian.wjspannablestringbuilder;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {
   
    private ListView mListView;
    private SpannableStringBuilder ssb;
    private List<SpannableStringBuilder> mSpannableData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView) findViewById(R.id.lvShowText);
        setSpannableData();
        mListView.setAdapter(new ListViewAdapter(this,mSpannableData));
    }

    /**
     * 初始化数据
     */
    private void setSpannableData() {
        if(mSpannableData == null){
            mSpannableData = new ArrayList<SpannableStringBuilder>();
        }

        //1.为指定的区间[1,4)设置指定的颜色
        ssb = new SpannableStringBuilder("为指定的区间[1,4)设置指定的颜色");
        ssb.setSpan(new ForegroundColorSpan(Color.GREEN),1,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        mSpannableData.add(ssb);

    }
}

Activity的setSpannableData()方法里面进行了对字符串设置样式,然后将该带样式字符串添加到了数据集合中。

  • ListViewAdapter
package com.wangjian.wjspannablestringbuilder;

import android.content.Context;
import android.text.SpannableStringBuilder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2016/1/12.
 */
public class ListViewAdapter extends BaseAdapter {
   
    private Context context;
    private List<SpannableStringBuilder> mSpannableData;

    public ListViewAdapter(Context context,List<SpannableStringBuilder> mSpannableData){
        this.context = context;
        this.mSpannableData = mSpannableData;
    }

    @Override
    public int getCount() {
        return mSpannableData.size();
    }

    @Override
    public Object getItem(int position) {
        return mSpannableData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return posit
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值