Android SpannableString/SpannableStringBuilder基本用法

概述

这两者都用于给文本内容中的一部分(通过start和end位置进行标记)或全部,附加额外的样式;可以对同一部分内容附加多种样式,以实现多种样式的叠加。
可以类比想象一下HTML中一个段落由很多组成,每个标签都可设置各自不同的样式。

区别

这两者的区别类似String和StringBuilder的区别。
SpannableString中文本内容本身是不可变的,但是可以给文本的不同部分添加或删除额外的标记对象,这种标记对象一般来说是可以应用到文本的一种样式。
SpannableStringBuilder更强大,文本内容可动态追加、插入、删除、替换等等。

工具类SpannableBuilder

笔者闲暇之余基于SpannableStringBuilder封装了如下工具类,先上部分代码。

public class SpannableBuilder {
    ArrayList<Unit> mList;

    public SpannableBuilder() {
        mList = new ArrayList<>();
    }

    public Unit append(String text) {
        Unit u = new Unit();
        u.text = text;
        u.isInline = true;
        mList.add(u);
        return u;
    }

    public Unit appendln(String text) {
        Unit u = new Unit();
        u.text = text;
        u.isInline = false;
        mList.add(u);
        return u;
    }

    public SpannableStringBuilder build() {
        SpannableStringBuilder sb = new SpannableStringBuilder();
        Unit unit;
        for (int i = 0; i < mList.size(); i++) {
            unit = mList.get(i);
            int start = sb.length();
            sb.append(unit.text);
            int end = sb.length();
            if(unit.isInline) {
                sb.append("\n");
            }
            Object what = new ForegroundColorSpan(unit.textColor);
            sb.setSpan(what, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

            what = new AbsoluteSizeSpan(unit.textSize, true);
            sb.setSpan(what, start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
        }
        return sb;
    }

    public static class Unit {
        private String text;
        private int textColor;
        private int textSize;
        private boolean isInline;

        public Unit text(String text) {
            this.text = text;
            return this;
        }
        public Unit textColor(int color) {
            this.textColor = color;
            return this;
        }
        public Unit textColor(String colorString) {
            this.textColor = Color.parseColor(colorString);
            return this;
        }

        public Unit textSize(int size) {
            this.textSize = size;
            return this;
        }
    }
}

如何使用
TextView tvTest= findViewById(R.id.tvTest);
SpannableBuilder sb = new SpannableBuilder();
//也可以用appendln实现换行
sb.append("共").textColor(getResources().getColor(R.color.t3)).textSize(13);
SpannableBuilder.Unit unit = sb.append("60").textColor(getResources().getColor(R.color.red1)).textSize(18);
sb.append("箱").textColor(getResources().getColor(R.color.t3)).textSize(13);
tvHeapTotal.setText(sb.build());

//后面又修改了文字
unit.text("100");
tvTest.setText(sb.build());

效果

限于篇幅,贴出的代码只实现了文本颜色和字体大小的设置,完整和最新的代码请参考GitHub。

你可能感兴趣的:(Android/iOS,App)