SpannableString与SpannableStringBuilder

来源:互联网 发布:window关闭占用的端口 编辑:程序博客网 时间:2024/06/06 09:54

SpannableString、SpannableStringBuilder与String的关系

首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。所以,总而言之,SpannableString、SpannableStringBuilder与String一样, 首先也是传字符串,但SpannableString、SpannableStringBuilder可以对这些字符串添加额外的样式信息,但String则不行

注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息

SpannableString与SpannableStringBuilder区别

它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方法来拼接多个String

SpannableString word = new SpannableString("代码狂欢到深夜");        SpannableStringBuilder multiWord = new SpannableStringBuilder();        multiWord.append("代码");        multiWord.append("狂欢");        multiWord.append("到深夜");

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 :前后都包括

例子

xml代码

    <EditText        android:id="@+id/edit"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>

java代码

public class MainActivity extends AppCompatActivity {    EditText editText;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        editText = (EditText) findViewById(R.id.edit);        //改变字体颜色        //先构造SpannableString        SpannableString spannableString = new SpannableString("代码狂欢到深夜");        //再构造一个改变字体颜色的Span        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);        //将这个Span应用于指定范围的字体        spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        editText.setText(spannableString);    }}

效果

效果

在指定字符后输入后使用样式

再指定字符后输入后使用样式

在指定字符前输入不使用样式
在指定字符前输入不使用样式

各种Span设置

要应用一个Span总共分三步:
1、构造String
2、构造Span
3、利用SetSpan()对指定范围的String应用这个Span

字体颜色设置(ForegroundColorSpan)

字体颜色设置

//改变字体颜色        //先构造SpannableString        SpannableString spannableString = new SpannableString("代码狂欢到深夜");        //再构造一个改变字体颜色的Span        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.RED);        //将这个Span应用于指定范围的字体        spannableString.setSpan(foregroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

字体背景颜色(BackgroundColorSpan)

字体背景颜色

        SpannableString spannableString = new SpannableString("代码狂欢到深夜");        BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.RED);        spannableString.setSpan(backgroundColorSpan,2,4, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

字体大小(AbsoluteSizeSpan)

字体大小

SpannableString spannableString = new SpannableString("代码狂欢到深夜");        AbsoluteSizeSpan absoluteSizeSpan = new AbsoluteSizeSpan(30);        spannableString.setSpan(absoluteSizeSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

粗体、斜体(StyleSpan)

粗体、斜体

 SpannableString spannableString = new SpannableString("代码狂欢到深夜");        StyleSpan styleSpan = new StyleSpan(Typeface.BOLD_ITALIC);        spannableString.setSpan(styleSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

删除线(StrikethroughSpan)

删除线

SpannableString spannableString = new SpannableString("代码狂欢到深夜");        StrikethroughSpan strikethroughSpan = new StrikethroughSpan();        spannableString.setSpan(strikethroughSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

下划线(UnderlineSpan)

下划线

SpannableString spannableString = new SpannableString("代码狂欢到深夜");        UnderlineSpan underlineSpan = new UnderlineSpan();        spannableString.setSpan(underlineSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

图片置换(ImageSpan)

图片置换

 SpannableString spannableString = new SpannableString("代码狂欢到深夜");        Drawable d = getResources().getDrawable(R.drawable.heart);        d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());        ImageSpan imageSpan = new ImageSpan(d,ImageSpan.ALIGN_BASELINE);        spannableString.setSpan(imageSpan,2,4, Spannable.SPAN_INCLUSIVE_INCLUSIVE);        editText.setText(spannableString);

总结自:启航大神的博客http://blog.csdn.net/harvic880925/article/details/38984705

原创粉丝点击