TextView 中SpannableString应用,让你灵活玩转TextView

本文详细介绍了如何使用SpannableString在Android的TextView中设置文本的背景颜色、点击事件、颜色、删除线、下划线、图片、缩放、字体样式、上下标和超链接等。通过示例代码展示了各种用法,帮助开发者实现更灵活的文本展示效果。
摘要由CSDN通过智能技术生成

TextView算是Android开发中最最常用的控件了,有的时候,我们要给一个TextView中的显示的文字设置不同的样式或者响应事件,比如同一个TextView中,有的字是红色,有的字是蓝色,有的字点击之后有响应事件,有的点击之后没有响应事件,甚至我们想在TextView中显示一个数学公式等等,那么对于形形色色的需求我们有没有解决方案呢?当然有,一种是使用HTML来解决,另一种就是使用SpannableString,HTML比较简单,本文主要介绍后者。SpannableString可以用来显示复合文本,我们可以通过SpannableString给文本设置各种各样的样式,下面我们就来看看SpannableString的一些常见用法。

1.设置TextView的背景颜色

要想在TextView中设置不同颜色、大小、图文混排的效果,必须通过SpannableString的setSpan()方法来实现。

//SpannableString.java
public void setSpan(Object what, int start, int end, int flags) {
        super.setSpan(what, start, end, flags);
    }

其中:

  • what传入各种Span类型的实例;

  • start和end标记要替代的文字内容的范围

  • flags是用来标识在Span范围内的文本前后输入新的字符时是否把它们也应用这个效果,可以传入Spanned.SPAN_EXCLUSIVE_EXCLUSIVE、Spanned.SPAN_INCLUSIVE_EXCLUSIVE、Spanned.SPAN_EXCLUSIVE_INCLUSIVE、Spanned.SPAN_INCLUSIVE_INCLUSIVE几个参数,INCLUSIVE表示应用该效果EXCLUSIVE表示不应用该效果,如Spanned.SPAN_INCLUSIVE_EXCLUSIVE表示对前面的文字应用该效果,而对后面的文字不应用该效果

给TextView设置背景颜色这本身是很简单的,在XML文件中直接加入background属性即可,下面我们来看看怎么样通过SpannableString来给TextView设置背景颜色:

    tv1 = (TextView) this.findViewById(R.id.tv1);  
            SpannableString ss1 = new SpannableString("设置背景颜色");  
            ss1.setSpan(new BackgroundColorSpan(Color.parseColor("#FFD700")), 0,  
                    ss1.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);  
            tv1.setText(ss1);  

首先拿到一个TextView,然后构造一个SpannableString,构造方法中传入的参数就是我们要显示的文字,然后就是一个最终要的方法,通过setSpan来设置背景色,第一个参数是我们要设置的背景颜色,第二第三个参数是我们要给哪一段的文字设置背景(该段文字的startIndex和endIndex),最后一个参数有四个值:

    /** 
     * Non-0-length spans of type SPAN_INCLUSIVE_EXCLUSIVE expand 
     * to include text inserted at their starting point but not at their 
     * ending point.  When 0-length, they behave like marks. 
     */  
    public static final int SPAN_INCLUSIVE_EXCLUSIVE = SPAN_MARK_MARK;  

    /** 
     * Spans of type SPAN_INCLUSIVE_INCLUSIVE expand 
     * to include text inserted at either their starting or ending point. 
     */  
    public static final int SPAN_INCLUSIVE_INCLUSIVE = SPAN_MARK_POINT;  

    /** 
     * Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand 
     * to include text inserted at either their starting or ending point. 
     * They can never have a length of 0 and are automatically removed 
     * from the buffer if all the text they cover is removed. 
     */  
    public static final int SPAN_EXCLUSIVE_EXCLUSIVE = SPAN_POINT_MARK;  

    /** 
     * Non-0-length spans of type SPAN_EXCLUSIVE_INCLUSIVE expand 
     * to include text inserted at their ending point but not at their 
     * starting point.  When 0-length, they behave like points. 
     */  
    public static final int SPAN_EXCLUSIVE_INCLUSIVE = SPAN_POINT_POINT;  

这四个值分别表示

1.前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式

2.前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式

3.前面不包括,后面不包括

4.前面不包括,后面包括

好了,我们这里设置的是前面不包括,后面包括,我们看看效果:

img

当我们点击按钮的时候会不断往tv1中追加新的文本,这时新的文本会自动使用这个背景样式,这是因为我们的最后一个参数设置为了Spanned.SPAN_EXCLUSIVE_INCLUSIVE,我们的点击事件是这样的:

    tv1.append("1234");  

2.给文本设置点击事件

文本设置点击事件本身也是非常简单,之间在XML文件中设置clickable属性为true,然后就可以像给Button设置点击事件一样给TextView设置点击事件了,但是如果我们只想给一个TextView中的某几个文字设置点击事件,而不想给整个TextView设置点击事件,那么该怎么做?看下面的代码:

    tv2 = (TextView) this.findViewById(R.id.tv2);  
    SpannableString ss2 = new SpannableString("点我吧123456");  
    ss2.setSpan(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值