问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Kotlin开发者必学:TextView高级玩法

创作时间:
作者:
@小白创作中心

Kotlin开发者必学:TextView高级玩法

引用
CSDN
12
来源
1.
https://blog.csdn.net/weixin_31435039/article/details/112811567
2.
https://blog.csdn.net/u010126792/article/details/88871905
3.
https://blog.csdn.net/qq_23049111/article/details/126121383
4.
https://blog.csdn.net/cunchi4221/article/details/107477615
5.
https://blog.csdn.net/Jason_HD/article/details/126787634
6.
https://blog.csdn.net/qq_34888036/article/details/131793714
7.
https://blog.csdn.net/ZHXLXH/article/details/127215383
8.
https://wenku.csdn.net/answer/e704085c850c42108d5382a3cd0254d5
9.
https://www.yisu.com/jc/890271.html
10.
https://juejin.cn/post/7389211334640713737
11.
https://juejin.cn/post/6844904085217345549
12.
https://www.cnblogs.com/qixingchao/p/11978229.html

在Android开发中,TextView是最常用的UI组件之一,用于显示文本信息。虽然基本的文本显示功能很简单,但TextView还提供了许多高级特性,可以帮助开发者创建更丰富、更互动的用户界面。本文将深入探讨TextView的高级用法,包括复杂文本样式的设置、自定义属性的使用以及性能优化技巧。

01

高级文本样式设置

TextView不仅可以显示简单的文本,还可以通过SpannableString实现复杂的文本样式。SpannableString允许我们在同一段文本中应用不同的样式,如字体、颜色、下划线等。

使用SpannableString

以下是一个示例,展示了如何使用SpannableString来设置不同样式的文本:

val textView = findViewById<TextView>(R.id.textView)
val spannableString = SpannableString("这是一个示例文本,展示不同样式的应用。")

// 设置部分文本为粗体
spannableString.setSpan(StyleSpan(Typeface.BOLD), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 设置部分文本为斜体
spannableString.setSpan(StyleSpan(Typeface.ITALIC), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 设置部分文本的颜色
spannableString.setSpan(ForegroundColorSpan(Color.BLUE), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 设置下划线
spannableString.setSpan(UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

textView.text = spannableString

HTML嵌入和图片插入

除了SpannableString,我们还可以使用Html.fromHtml()方法来解析包含HTML标签的字符串,实现更复杂的文本格式。此外,通过ImageSpan,我们甚至可以在文本中插入图片。

val htmlString = "<font color='red'>红色文本</font><img src='icon.png'/>"
val imageGetter = Html.ImageGetter { source ->
    val drawable = ContextCompat.getDrawable(this, resources.getIdentifier(source, "drawable", packageName))
    drawable?.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
    drawable
}
val spanned = Html.fromHtml(htmlString, imageGetter, null)
textView.text = spanned

02

自定义属性

在实际项目中,我们经常需要为TextView添加一些自定义属性,以满足特定的设计需求。这可以通过在attrs.xml中定义属性来实现。

定义自定义属性

在res/values/attrs.xml文件中,我们可以定义自己的属性:

<declare-styleable name="CustomTextView">
    <attr name="customTextColor" format="color"/>
    <attr name="customTextSize" format="dimension"/>
    <attr name="customFontStyle" format="enum">
        <enum name="normal" value="0"/>
        <enum name="bold" value="1"/>
        <enum name="italic" value="2"/>
    </attr>
</declare-styleable>

读取自定义属性

在自定义TextView的构造函数中,我们需要读取这些属性:

class CustomTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {

    init {
        attrs?.let {
            val typedArray = context.obtainStyledAttributes(it, R.styleable.CustomTextView)
            val textColor = typedArray.getColor(R.styleable.CustomTextView_customTextColor, Color.BLACK)
            val textSize = typedArray.getDimension(R.styleable.CustomTextView_customTextSize, textSize)
            val fontStyle = typedArray.getInt(R.styleable.CustomTextView_customFontStyle, Typeface.NORMAL)

            setTextColor(textColor)
            setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
            setTypeface(typeface, fontStyle)

            typedArray.recycle()
        }
    }
}
03

性能优化技巧

在使用TextView时,我们需要注意一些性能问题,特别是当TextView的宽度设置为wrap_content时。

避免使用wrap_content

当TextView的宽度设置为wrap_content时,每次调用setText()方法都会导致整个视图树重新布局,这会严重影响性能。以下是两种优化方案:

  • 使用match_parent:如果可能,尽量使用match_parent代替wrap_content。
  • 使用ConstraintLayout:在ConstraintLayout中,即使将TextView的宽度设置为0dp,也不会影响内容的显示,同时避免了重新布局的问题。
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
04

实战案例

为了更好地理解TextView的高级用法,让我们通过一个完整的案例来展示如何在实际项目中应用这些特性。

假设我们需要创建一个显示用户信息的TextView,包括用户名、邮箱和电话号码。我们希望用户名显示为粗体,邮箱和电话号码可以点击跳转。

val textView = findViewById<TextView>(R.id.textView)
val spannableString = SpannableString("用户名:张三\n邮箱:zhangsan@example.com\n电话:1234567890")

// 设置用户名为粗体
spannableString.setSpan(StyleSpan(Typeface.BOLD), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 设置邮箱为可点击链接
val emailStart = spannableString.indexOf("zhangsan@example.com")
val emailEnd = emailStart + "zhangsan@example.com".length
spannableString.setSpan(object : ClickableSpan() {
    override fun onClick(widget: View) {
        val intent = Intent(Intent.ACTION_SENDTO)
        intent.data = Uri.parse("mailto:zhangsan@example.com")
        startActivity(intent)
    }
}, emailStart, emailEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 设置电话为可点击链接
val phoneStart = spannableString.indexOf("1234567890")
val phoneEnd = phoneStart + "1234567890".length
spannableString.setSpan(object : ClickableSpan() {
    override fun onClick(widget: View) {
        val intent = Intent(Intent.ACTION_DIAL)
        intent.data = Uri.parse("tel:1234567890")
        startActivity(intent)
    }
}, phoneStart, phoneEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

// 启用链接点击
textView.movementMethod = LinkMovementMethod.getInstance()
textView.text = spannableString

通过这个案例,我们可以看到TextView的高级特性如何帮助我们创建更丰富、更互动的用户界面。无论是复杂的文本样式、自定义属性还是性能优化,这些技巧都能让我们的应用更加出色。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号