安卓富文本部分高亮及点击事件
- 前言
 - 一、富文本是什么?
 - 二、实现方法
 - 1.使用html
 - 2.使用SpannableString
 
- 总结
 

前言
富文本其实不是很常用,但有遇到了过后使用很方便的场景,例如免责声明。这时候就很重要了,前段时间遇到了,自己重新整理了下方便以后找
一、富文本是什么?
安卓富文本是一种允许用户以富文本格式(如加粗、斜体、下划线、颜色、字号等)输入和显示文本内容的技术。在安卓应用程序中,富文本可以用于各种用途,例如文字编辑器、邮件应用、社交媒体应用、文本处理应用等。通过使用富文本,用户可以更加直观地表达自己的想法和情感,也可以更好地组织和呈现文本内容。
二、实现方法
1.使用html
以下是一个简单的示例:
-  
首先,在你的安卓应用中创建一个名为“rich_text.html”的html文件,并将其放置在“assets”文件夹中。
 -  
在该文件中,你可以使用html标签来创建富文本。例如:
 
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>富文本示例</title>
</head>
<body>
    <h1>这是一个标题</h1>
    <p>这是一段文本。</p>
    <p>这是另一段文本。</p>
    <ul>
        <li>列表项一</li>
        <li>列表项二</li>
        <li>列表项三</li>
    </ul>
    <ol>
        <li>有序列表项一</li>
        <li>有序列表项二</li>
        <li>有序列表项三</li>
    </ol>
    <p>下面是一个图片:</p>
    <img src="https://www.example.com/image.png" alt="示例图片">
    <p>这是一个链接:</p>
    <a href="https://www.example.com">点击跳转</a>
</body>
</html>
 
- 然后,在你的代码中加载该html文件并显示出来。示例如下:
 
WebView webView = findViewById(R.id.webView); // 获取WebView控件
webView.getSettings().setJavaScriptEnabled(true); // 允许执行JavaScript
webView.loadUrl("file:///android_asset/rich_text.html"); // 加载html文件
 
- 最后,在你的布局文件中添加一个WebView控件:
 
<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
 
这样,你就可以在安卓应用中使用html实现富文本了。
2.使用SpannableString
代码如下(示例):
    /**
     * @time 2023/9/12 17:08
     * @Description: 设置富文本
     */
    private fun setRichText() {
        val content = resources.getString(R.string.tv_check_text)
        val replaceTxt = resources.getString(R.string.tv_check_text_replace)
        val sb = SpannableString(content) //content表示文本内容
        val startIndex = content.indexOf(replaceTxt)
        val endIndex = startIndex + replaceTxt.length
        //让超链接的点击事件生效
        mBinding.ctvCheckText.movementMethod = LinkMovementMethod.getInstance()
        val clickSpan: ClickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
         
                Log.i(TAG, "setRichText: click$replaceTxt")
            }
            override fun updateDrawState(ds: TextPaint) {
                ds.run { //这里可以动态设置点击区域字符的字体样式,比如颜色、字体、大小、下划线、删除线等
//                    typeface = FontManager.getNumberFont()
                    color = ContextCompat.getColor(context!!, R.color.ff00b4ff)
                }
            }
        }
        sb.setSpan(
            clickSpan, //span类型 specailColor颜色
            startIndex, //span的起始index
            endIndex, //span的结束index(一般为startIndex + replaceTxt.length)
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //span类型,设置startIndex和endIndex的开闭区间
        )
        mBinding.ctvCheckText.text = sb
    }
 
代码说明:
- content 就是我们需要展示的富文本
 - replaceTxt 是展示的富文本中,我们需要操作的部分,示例中改变了其中的颜色
 - sb SpannableString
 - startIndex 需要操作部分的开始位置
 - endIndex 需要操作部分的结束位置
 
值得注意的是必须添加
 //让超链接的点击事件生效
        mBinding.ctvCheckText.movementMethod = LinkMovementMethod.getInstance()
 
否则点击事件就算设置了ClickableSpan 也不会生效,原理就是事件的分发。
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
 - Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
 - Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。
 - Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。
 
最后通过setText方法将SpannableString 设置进去就能收到点击回调和查看富文本效果
总结
本文主要介绍了安卓富文本的实现方式。第一种是使用html格式的富文本,需要先创建一个html文件,然后使用WebView加载该文件以显示富文本。第二种是使用SpannableString,需要创建一个SpannableString对象,并设置需要高亮或点击的部分的起始和结束位置以及对应的点击事件。在设置完富文本后,需要将其设置到TextView或其他文本控件中以显示效果。


















