美文网首页
【Android】Spannable String:使用 Spa

【Android】Spannable String:使用 Spa

作者: Darren老师 | 来源:发表于2022-07-05 14:24 被阅读0次

    前言

    文本样式是增强 Android 应用程序 UI 的重要方面之一。在 Android 中,我们可以更改文本的大小、颜色、粗细、样式等,使文本更具吸引力和吸引力。

    但是考虑一种情况,当您希望 TextView 的不同部分使用不同的颜色时。例如,如果文本是“Hello Android”,并且您希望“Hello”的颜色为绿色,“Android”的颜色为红色。你怎么能做到这一点?您可以制作两个 TextView 并将 textColor 分别设置为绿色和红色。但这不是这样做的好方法。因此,在 Spans 的帮助下,文本样式的作用就出现了。

    在这篇文章中,我们将学习如何使用 Spans 来设置应用程序中使用的文本样式。我们将讨论以下主题:

    • 什么是跨度?
    • 为 TextView 中的不同单词更改不同的颜色
    • 可扩展标志
    • 更改 TextView 某些部分的背景颜色
    • 多个跨度到相同的文本
    • 同一个TextView中字符串的不同字体大小
    • 在 TextView 中为部分文本添加下划线
    • 设置 TextView Clickable 的某些部分
    • 在 Android 中添加项目符号列表

    什么是跨度?

    跨度是用于在字符级别(例如,更改不同单词的颜色)或段落级别(例如,制作项目符号列表)设置文本样式的标记对象。

    为了在 Spans 的帮助下设置文本样式,可以使用以下三个类:

    • SpannedString:在创建后不需要修改文本或标记时使用。
    • SpannableString:当不需要修改文本但您需要修改标记时使用,即您需要在文本中添加一些跨度。
    • SpannableStringBuilder:当您需要修改文本和标记时使用它。

    这是关于 Android 中 Spans 的快速介绍。现在,让我们看看它的一些用例。在我们所有的示例中,我们将使用以下具有 id 的 TextView tvMessage:

    <TextView
        android:id="@+id/tvMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:gravity="center"
        android:textColor="@color/black"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="Hello World!" />
    

    为 TextView 中的不同单词更改不同的颜色

    在某些情况下,您希望为同一文本视图的不同部分使用不同的颜色。所以,在这里你可以使用ForegroundColorSpan.

    val spannable = SpannableString("You can start learning Android from MindOrks")
    spannable.setSpan(
        ForegroundColorSpan(Color.RED),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    tvMessage.text = spannable
    

    在这里,我们将“MindOrks”的颜色更改为红色。

    如果您查看代码,那么您会发现我们正在使用SpannableString该类,因为我们有一个固定的文本。此外,我们正在使用该setSpan方法设置从字符串中第 36 位开始到第 44 位结束的文本的前景色。此外,我们正在传递一些标志,即Spannable.SPAN_EXCLUSIVE_INCLUSIVE.

    让我们了解这些标志。

    可扩展标志

    Spans 可以使用许多标志,但最常用的标志是:

    • SPAN_EXCLUSIVE_EXCLUSIVE
    • SPAN_EXCLUSIVE_INCLUSIVE
    • SPAN_INCLUSIVE_EXCLUSIVE
    • SPAN_INCLUSIVE_INCLUSIVE

    这些标志用于告诉 Span 是否应该包含在开始或结束位置插入的文本。Inclusive 表示将其添加到 Span 中,exclusive 表示将其从 Span 中删除。

    如果您使用的是不可变字符串,即如果您没有在原始字符串中添加其他字符串,那么所有四个标志都将起作用。但是如果你使用的是可变字符串,那么这四个标志的作用就会发挥作用。让我们借助一个例子来理解这一点。

    在这里,我们将在原始字符串中插入一些文本。因此,如前所述,对于可变字符串,我们需要使用SpannableStringBuilder.

    val spannableStringBuilder = SpannableStringBuilder("Android")
    spannableStringBuilder.setSpan(
        ForegroundColorSpan(Color.RED),
        1, // start
        4, // end
        Spannable.SPAN_INCLUSIVE_INCLUSIVE
    )
    spannableStringBuilder.insert(4, "1")
    spannableStringBuilder.insert(1, "1")
    tvMessage.text = spannableStringBuilder
    

    多个跨度到相同的文本

    setSpan您也可以在单个文本上多次使用该方法。例如,如果要更改文本的颜色,同时使其变为粗体和斜体,则可以通过以下方式执行此操作:

    val spannable = SpannableString("You can start learning Android from MindOrks")
    spannable.setSpan(
        ForegroundColorSpan(Color.RED),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    spannable.setSpan(
        StyleSpan(Typeface.BOLD_ITALIC),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    tvMessage.text = spannable
    

    这里,文本的颜色是红色,同时是粗体和斜体。

    您可以根据setSpan需要多次使用该方法。

    更改 TextView 某些部分的背景颜色

    您可以使用 更改 TextView 中部分文本的背景颜色BackgroundColorSpan。

    val spannable = SpannableString("You can start learning Android from MindOrks")
    spannable.setSpan(
        BackgroundColorSpan(Color.RED),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    tvMessage.text = spannable
    

    在这里,我们将背景更改为红色。

    同一个TextView中字符串的不同字体大小

    您可以使用RelativeSizeSpan来更改 TextView 某些部分的大小。文本大小的变化将是相对的,即相对于字符串中的其他文本。

    val spannable = SpannableString("You can start learning Android from MindOrks")
    spannable.setSpan(
        RelativeSizeSpan(2f),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    tvMessage.text = spannable
    

    在这里,“MindOrks”的大小2f比其他文本大。

    在 TextView 中为部分文本添加下划线

    您可以使用以下方式为文本的一部分添加下划线UnderlineSpan:

    val spannable = SpannableString("You can start learning Android from MindOrks")
    spannable.setSpan(
        UnderlineSpan(),
        36, // start
        44, // end
        Spannable.SPAN_EXCLUSIVE_INCLUSIVE
    )
    tvMessage.text = spannable
    

    设置 TextView Clickable 的某些部分

    您可以使用ClickableSpan. 例如:

    val spanText = SpannableStringBuilder("MindOrks")
    
    val clickableMindOrks = object : ClickableSpan() {
        override fun onClick(view: View) {
            Toast.makeText(view.context, "MindOrks Clicked!", Toast.LENGTH_SHORT).show()
        }
    }
    spanText.setSpan(
        clickableMindOrks,
        0,
        spanText.length,
        0
    )
    spanText.setSpan(
        ForegroundColorSpan(Color.RED),
        0, // start
        8, // end
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
    tvMessage.setText(spanText, TextView.BufferType.SPANNABLE)
    

    在这里,点击“MindOrks”会显示一个 toast。

    在 Android 中添加项目符号列表

    在 的帮助下BulletSpan,您可以在应用程序中创建一个项目符号列表,以便以简短的方式显示一些信息。

    // function to covert a list into bullet list
    fun convertToBulletList(stringList: List<String>): CharSequence {
        val spannableStringBuilder = SpannableStringBuilder("Learn Android from\n")
        stringList.forEachIndexed { index, text ->
            val line: CharSequence = text + if (index < stringList.size - 1) "\n" else ""
            val spannable: Spannable = SpannableString(line)
            spannable.setSpan(
                BulletSpan(15, Color.RED),
                0,
                spannable.length,
                Spanned.SPAN_INCLUSIVE_EXCLUSIVE
            )
            spannableStringBuilder.append(spannable)
        }
        return spannableStringBuilder
    }
    val androidResourceList = listOf("MindOrks Course", "MindOrks Blog", "MindOrks OpenSource", "MindOrks YouTube")
    tvMessage.text = convertToBulletList(androidResourceList)
    

    因此,通过这种方式,我们可以使用 Spans 来设置应用程序中的文本样式。

    希望你今天学到了一些新东西,我相信你很快就会在你的应用程序中使用这些很棒的功能。

    作者:Sumit Mishra
    链接:https://blog.mindorks.com/spannable-string-text-styling-with-spans

    相关文章

      网友评论

          本文标题:【Android】Spannable String:使用 Spa

          本文链接:https://www.haomeiwen.com/subject/ihlybrtx.html