广告
返回顶部
首页 > 资讯 > 移动开发 >Android学习之Span的使用方法详解
  • 678
分享到

Android学习之Span的使用方法详解

2024-04-02 19:04:59 678人浏览 八月长安
摘要

目录Span集合段落类Span其他Span展示效果小试牛刀小结Span集合 段落类Span BulletSpan 为段落开头增加项目符号并支持大小、颜色、弧度 span.append

Span集合

段落类Span

BulletSpan

为段落开头增加项目符号并支持大小、颜色、弧度

span.append(SpannableString("BulletSpan").also {
    it.setSpan(BulletSpan(40, Color.RED), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
})

QuoteSpan

为段落开头增加垂直引用线

span.append(SpannableString("\nQuoteSpan").also {
    it.setSpan(QuoteSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
})

AlignmentSpan

影响段落对齐方式,支持三种模式:常规、居中、反方向对齐

span.append(SpannableString("\nAlignmentSpan ALIGN_CENTER").also {
    it.setSpan(
        AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
        0,
        "AlignmentSpan ALIGN_CENTER".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

UnderlineSpan

为文本段落增加下划线

span.append(SpannableString("\nUnderlineSpan").also {
    it.setSpan(
        UnderlineSpan(),
        0,
        "UnderlineSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

StrikethroughSpan

为文本段落增加删除线

span.append(SpannableString("\nStrikethroughSpan").also {
    it.setSpan(
        StrikethroughSpan(),
        0,
        "StrikethroughSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

SubscriptSpan

为文本段落实现下标字符效果,缩小文本大小。

span.append(SpannableString("\n123SubscriptSpan456").also {
    it.setSpan(
        SubscriptSpan(),
        3,
        "SubscriptSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

SuperscripSpan

为文本段落实现上标字符效果,缩小文本大小。

span.append(SpannableString("\n123SuperscriptSpan456").also {
    it.setSpan(
        SuperscriptSpan(),
        3,
        "SuperscriptSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

TextApperanceSpan

根据配置文件信息为文本添加样式,可塑性更方便易用和复写。

span.append(SpannableString("\nTextAppearanceSpan").also {
    it.setSpan(
        TextAppearanceSpan(this@FuncSpannableAc,R.style.specialTextAppearance),
        0,
        "TextAppearanceSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

结合xml文件样式配置使用

<style name="specialTextAppearance" parent="@Android:style/TextAppearance">
    <item name="android:textColor">@android:color/holo_red_dark</item>
    <item name="android:textColorHighlight">@android:color/holo_blue_bright</item>
    <item name="android:textColorHint">@color/purple_700</item>
    <item name="android:textColorLink">@color/purple_200</item>
    <item name="android:textSize">20sp</item>
    <item name="android:textStyle">italic</item>
</style>

其他Span

BackgroundColorSpan

为文本段落增加背景色效果。

span.setSpan(BackgroundColorSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

ForegroundColorSpan

修改文本颜色,主要是因为在一个段落中可能需要修改某几个字符颜色。

span.setSpan(ForegroundColorSpan(Color.RED), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

TextClickableSpan

为文本段落增加可点击,可以理解为自定义的URLSpan。因此点击事件需要开发者自定义继承实现ClickableSpan

span.setSpan(TextClickableSpan(), 10, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
class TextClickableSpan : ClickableSpan() {
    override fun onClick(widget: View) {
        Toast.makeText(widget.context, "TextClickSpan", Toast.LENGTH_SHORT).show()
    }
}

URLSpan

为文本段落增加超链接点击功能,可跳转到网页(外置浏览器形式)。

另外一个小TipssetSpan是可以在同一下标设置多重样式效果。例如URLSpanForegroundColorSpan可重叠使用,原URLSpan超链接的文本颜色需要替换结合ForegroundColorSpan就能实现。

span.setSpan(
    URLSpan("https://www.baidu.com"),
    20,
    23,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
// 尝试超链接是否可以修改颜色(结果是可以说明和上述BackgroundColorSpan和ForegroundColorSpan一样)
span.setSpan(ForegroundColorSpan(Color.RED), 20, 23, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

StyleSpan

修改文本段落样式,可设置样式较为有限。一般还是推荐使用TextApperanceSpan可配置项更多

span.setSpan(StyleSpan(Typeface.BOLD), 38, 47, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

ImageSpan

支持在段落中插入图片资源,支持类型包括可以是Bitmap图片资源、ResourceId资源文件又或者是本地文件Uri资源。

span.setSpan(
    ImageSpan(this, R.mipmap.ic_launcher, DynamicDrawableSpan.ALIGN_BASELINE),
    47, 48, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

展示效果

小试牛刀

对于长文本内容需要设置多种样式时尽量使用SpannableStringBuilder方便定位每个新增setSpan的下标而不需要使用SpannableString来计算定位每个位置来确认样式(容易出错)可以避免需要不必要麻烦和错误。

var spannableString = SpannableString("ColorSpan ClickSpan URL UnderlineSpan StyleSpan ")

spannableString.also { span ->
    span.setSpan(BackgroundColorSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    span.setSpan(ForegroundColorSpan(Color.RED), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    ......
}
var spannableString2 = SpannableStringBuilder("")
spannableString2.also { span ->
    span.append(SpannableString("BulletSpan").also {
        it.setSpan(BulletSpan(40, Color.RED), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
    span.append(SpannableString("\nQuoteSpan").also {
        it.setSpan(QuoteSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
}

两者代码一对比就能知道采用SpannableStringBuilder形式代码结构和可读性以及出现样式定位错误的情况会小很多。

如图所示过去对于这种样式开发者或许会选择使用两个TextView来实现,前面为固定文本后面是参数内容。在了解如何使用Span为TextView增加样式只需一个TextView就能实现,同时也减轻一些业务开发量(当参数为空时整个view不展示、view布局关系依赖和层级更简单等)

var spannableString3 = SpannableStringBuilder("")
spannableString3.also { span ->
    span.append(SpannableString("人均费用:").also {
        it.setSpan(StyleSpan(Typeface.BOLD), 0, "人均费用".length + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
    span.append(SpannableString("99元/人"))
}

小结

学会使用Span对于文本样式开发会有所帮助,能够快速开发易用方便的文本样式效果。但对于其他一些效果或许无法达成例如形状样式结合文本共用同一个TextView开发会存在困难。

到此这篇关于Android学习之Span的使用方法详解的文章就介绍到这了,更多相关Android Span使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Android学习之Span的使用方法详解

本文链接: https://www.lsjlt.com/news/151190.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android学习之Span的使用方法详解
    目录Span集合段落类Span其他Span展示效果小试牛刀小结Span集合 段落类Span BulletSpan 为段落开头增加项目符号并支持大小、颜色、弧度 span.append...
    99+
    2022-11-13
  • jsp学习之scriptlet的使用方法详解
    在JSP中,scriptlet是一种在JSP页面中嵌入Java代码的方式。它被包含在标签中,可以在其中编写任意的Java代码。下面是...
    99+
    2023-08-11
    jsp
  • Android学习之菜单的使用方法
    本文实例为大家分享了Android学习之菜单使用的具体代码,供大家参考,具体内容如下 Android中菜单包含上下文菜单和选项菜单两种类型。 使用统一的菜单类来管理菜单: Menu、...
    99+
    2022-11-13
  • Python学习之循环方法详解
    目录for循环while循环拓展:列表推导式常见的推导式方法循环的继续与退出(continue与break)continue的使用break的使用循环实现九九乘法表什么是循环? &m...
    99+
    2022-11-13
  • Android组件必学之TabHost使用方法详解
    一、TabHost用法 通常情况下我们会通过继承TabActivity,调用getTabHost()获取TabHost实例,下面是具体过程。 TabHostActivity.j...
    99+
    2022-06-06
    方法 tabhost Android
  • SpringJPA学习之delete方法示例详解
    目录一、deleteById 和 deletedeleteById(Id id)(通过id进行删除)delete(T entity)(通过实体对象进行删除)实例servic...
    99+
    2023-05-18
    Spring JPA delete方法 Spring JPA delete
  • 详解Springboot之Logback的使用学习
    目录一、导入依赖二、配置文件解析三、配置文件结构四、各个组件的作用五、Logger组件六、logger属性七、Appender组件一、导入依赖 普通项目 <dependen...
    99+
    2022-11-12
  • Vue学习之Vuex的使用详解
    目录简介优缺点优点缺点使用场景示例安装Vuex并引入 1.安装vuex2.编写vuex的store3.main.js引入CounterStore.js业务代码测试简介 说明...
    99+
    2022-11-13
  • Android ViewStub使用方法学习
    目录前言1.ViewStub的优势2.ViewStub的使用属性 功能简单实战1.viewstub就是动态加载试图2.看一个简单的demo3.当调用第二次inflate的时候,会报错...
    99+
    2022-11-16
    Android ViewStub使用 Android ViewStub
  • Java基础学习之构造方法详解
    目录一、构造方法概述二、构造方法的注意事项三、标准类制作一、构造方法概述 构造方法是一种特殊的方法 作用:创建对象Student stu = new Student(); 格式: p...
    99+
    2022-11-13
  • Go语言学习之结构体和方法使用详解
    目录1. 结构体别名定义2. 工厂模式3. Tag 原信息4. 匿名字段5. 方法1. 结构体别名定义 变量别名定义 package main import "fmt" type...
    99+
    2022-11-13
  • Android游戏开发学习之引擎用法实例详解
    本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下: 汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的。而游戏中的物理...
    99+
    2022-06-06
    开发学习 学习 Android
  • C++学习之指针的使用详解
    C++中指针储存一个地址 声明: datatype* p;  datatype表示指针指向的数据类型。 int num=0; int* pnum=&num; //&...
    99+
    2023-03-02
    C++指针使用 C++指针
  • Python学习之元组的使用详解
    目录元组的创建元组的删除元组部分元素的输出元组的嵌套元组元素的个数计算:len()元组中的元素最大最小值的求解:max(),min()元组中某元素出现的次数:count函数元组中某元...
    99+
    2022-11-11
  • C++学习之多态的使用详解
    目录前言多态向上转型向下转型作用域前言 最近为了完成数据库系统的实验,又复习起了《C++ Primer》,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的...
    99+
    2022-11-13
  • Android学习笔记之ListView复用机制详解
    PS:满打满算,差不多三个月没写博客了...前一阵忙的不可开交...总算是可以抽出时间研究研究其他事情了... 1.ListView的复用机制   ListView是...
    99+
    2022-06-06
    android学习 listview Android
  • Go语言学习之WaitGroup用法详解
    目录前言小试牛刀总览底层实现结构体AddDoneWait易错点总结前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言中的 ...
    99+
    2022-06-11
    GO 学习 go语言
  • jQuery学习笔记之Ajax用法详解
    这篇文章主要介绍了jQuery学习笔记之Ajax用法,长沙网站建设结合实例形式较为详细的分析总结了jQuery中ajax的相关使用技巧,包括ajax请求、载入、处理、传递等,需要的朋友可以参考下 ...
    99+
    2022-10-18
  • Python语法学习之进程的创建与常用方法详解
    目录进程的创建模块 - multiprocessing创建进程函数 - Process进程的常用方法start 函数join 函数kill 函数 与 is_alive 函数进程的相关...
    99+
    2022-11-10
  • Python语法学习之线程的创建与常用方法详解
    目录线程的创建与使用线程的创建 -threading线程对象的常用方法线程演示案例线程的问题线程的创建与使用 在Python中有很多的多线程模块,其中 threading ...
    99+
    2022-11-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作