Android SpannableString的用法

本文详细介绍Android中SpannableString的使用方法,包括文本颜色、背景色、字体大小、下划线、点击事件等特性,以及如何组合使用满足多样化需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在Android开发中我们应该经常遇到这种需求:给一段话的某些文字改变一下颜色,加一下下划线,添加点击跳转等等,这个时候我们该怎么做呢?
  使用多个TextView?布局中一堆TextView看着让人头大,可维护性又差并且性能也不好。这个时候就需要SpannableString出场啦!

  SpannableString实现了CharSequence接口,所以你可以理解它是一个字符串,但是不同于String,它可以对指定位置的字符进行修饰,比如设置字体大小、颜色、下划线、点击事件等等,一个SpannableString竟然可以做到这么多的事情,是不是很nice呢?

SpannableString用法

  首先初始化SpannableString

    SpannableString string = new SpannableString("我已经从你的全世界路过");

然后通过调用setSpan接口给string设置不同的显示效果

    SpannableString.setSpan(Object what, int start, int end, int flags)

解释一下各个参数的意义,

  • what:就是要设置的样式,继承CharacterStyle的各种Span,可以参考下图,下面会详细讲解演示各种效果Span的用法。
  • start:需要设置样式的开始位置
  • end:需要设置样式的借结束位置
  • flags:flagss一般设置为
    • Spanned.SPAN_INCLUSIVE_EXCLUSIVE
    • Spanned.SPAN_INCLUSIVE_INCLUSIVE
    • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    • Spanned.SPAN_EXCLUSIVE_INCLUSIVE
      以上四种,顾名思义INCLUSIVE就是包含,EXCLUSIVE就是不包含,所以换一种说法就是[start, end)、[start, end]、(start, end)、(start, end],这样说就明白了吧。

下面说一下各种Span的用法以及效果。

1 ForegroundColorSpan 前景色(文本颜色)

    string.setSpan(new ForegroundColorSpan(Color.RED), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(string);

设置第一个字体颜色为红色
在这里插入图片描述

2 BackgroundColorSpan 背景色

    string.setSpan(new BackgroundColorSpan(Color.CYAN), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体背景色为浅蓝色
在这里插入图片描述

3 RelativeSizeSpan 相对字体大小

    string.setSpan(new RelativeSizeSpan(2.0f), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体大小是(相对于)TextView字体大小(16sp)的2倍
在这里插入图片描述

4 AbsoluteSizeSpan 绝对字体大小

    string.setSpan(new AbsoluteSizeSpan(getResources().getDimensionPixelOffset(R.dimen.text_32sp)), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体大小是32sp
在这里插入图片描述

5 StrikethroughSpan 删除线

    string.setSpan(new StrikethroughSpan(), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体带删除线效果
在这里插入图片描述

6 UnderlineSpan 下划线

    string.setSpan(new UnderlineSpan(), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体带下滑线效果
在这里插入图片描述

7 ClickableSpan 局部点击

    string.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View widget) {
                Toast.makeText(MainActivity.this, "click ME!", Toast.LENGTH_LONG).show();
        }
    }, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    tvSpan.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setText(string);

设置第一个字的点击事件,这里和其他Span不同,需要给TextView设置一下MovementMethod。

8 URLSpan URL跳转

    string.setSpan(new URLSpan("https://me.youkuaiyun.com/blog/newcoderzZ"), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    tvSpan.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setText(string);

设置第一个字点击跳转URL,URLSpan是继承自ClickableSpan,同样需要设置一下MovementMethod。

9 ImageSpan 替换图片

    string.setSpan(new ImageSpan(this, R.drawable.ic_favorite_black_24dp), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(string);

设置第一个字用一个图片替代
在这里插入图片描述

10 StyleSpan 粗体斜体等

    // string.setSpan(new StyleSpan(Typeface.BOLD), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    string.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(string);

设置第一个字体设置粗体、斜体效果
在这里插入图片描述

11 SubscriptSpan 上标

    string.setSpan(new SubscriptSpanSugg(), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体下标效果
在这里插入图片描述

12 SuperscriptSpan 下标

    string.setSpan(new SuperscriptSpan(), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

设置第一个字体上标效果
在这里插入图片描述
而且各种Span也可以搭配起来组合使用,就能满足产品小姐姐的各种需求啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值