资讯动态

Android TextView 完全指南:从基础用法到 Spans 富文本与 Compose 迁移

发布时间:2026/10/3 2:25:08 来源:尧图企业网站定制
文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载TextView 是 Android 中最基础的 UI 控件之一负责向用户展示文本内容既可用于显示静态文字也可动态更新内容并支持字体、颜色、大小、样式等外观定制以及点击事件处理和基于 Spans 的富文本渲染。本文以 developer-roadmap 仓库中 Android 学习路线图的 TextView 文档 为核心骨架系统讲解 TextView 的核心概念、XML 与代码两种配置方式、常用属性、事件处理、Spans 富文本机制并结合仓库内 Jetpack Compose 的声明式 UI 方案给出从传统 View 体系向 ComposeText迁移的对照路径。读完本文你将能够独立完成 TextView 的声明、定制、交互与富文本渲染并理解其在整个 Android UI 体系中的位置。TextView 是什么Android 文本展示的基础组件TextView 是 Androidandroid.widget包中的核心控件其作用就是向用户展示文本。它是几乎所有界面文本呈现的底层承载者按钮的文字、列表项的标题、详情页的描述、状态提示等本质上都是 TextView 或其子类在起作用。在 Android View 体系中TextView 具有如下关键特性对应原文档的核心定义静态与动态内容既可以显示固定不变的静态文本也可以在程序运行期间通过代码动态更新内容满足状态变化、接口返回数据展示等场景外观高度可定制字体font、颜色color、大小size、样式style均可独立配置支持系统字体与自定义字体交互能力可以设置点击监听器OnClickListener让文本变成可交互元素例如阅读全文忘记密码等链接式文案富文本支持通过 Spans跨度标记机制可以在同一段文本内混排多种样式如局部加粗、变色、超链接、图片内联等。在 developer-roadmap 的 Android 学习路线中TextView 属于 UI 基础层的关键知识点与 Button、ImageView 等一起构成传统 View 体系的常用控件集合同时路线图中的 Jetpack Compose 分支提供了声明式替代方案Text组件本文将在最后给出两者对照。在 XML 布局中声明 TextViewTextView 的声明与绝大多数 Android 控件一样是在 XML 布局文件中完成的。下面是一个包含常用定制属性的完整示例TextView android:idid/my_text_view android:layout_widthwrap_content android:layout_heightwrap_content android:textHello, developer-roadmap! android:textSize18sp android:textColorcolor/primary_text android:textStylebold android:fontFamilysans-serif android:gravitycenter android:padding8dp android:clickabletrue android:autoLinkweb /各属性的作用说明如下属性取值示例说明android:text任意字符串或字符串资源引用要显示的文本内容正式项目建议使用string/xxx资源引用以便本地化android:textSize18sp、14dp文字大小推荐使用spscaled pixels它会跟随系统字体缩放设置保证无障碍访问体验android:textColorcolor/xxx或#FF6200EE文字颜色可通过 color 资源管理主题色android:textStylenormal/bold/italic文字样式可组合使用bold\|italicandroid:fontFamilysans-serif、sans-serif-light、monospace或自定义字体字体族也可以使用android:typeface指定系统字体类型android:gravitycenter、start、end、top、bottom控制文本在 TextView 内部的对其方式注意与layout_gravity区分后者控制控件在父容器中的位置android:maxLines整数如1、2限制最大行数常与android:ellipsizeend搭配实现单行省略号效果android:ellipsizestart/middle/end/marquee文本超出时的省略策略android:autoLinknone/web/email/phone/map/all自动识别文本中的网址、邮箱、电话等并转为可点击链接android:clickable/android:focusabletrue/false使 TextView 可点击、可聚焦是设置点击监听的前置条件android:padding尺寸值控件内边距避免文字贴边需要特别强调的是两个容易混淆的概念gravityvslayout_gravitygravity决定文本在 TextView 内部的对齐位置layout_gravity决定 TextView 自身在父容器如 LinearLayout中的位置spvsdp文字大小必须使用sp因为sp会随用户系统字体设置缩放符合 Android 的无障碍设计规范控件尺寸、间距使用dp。在代码中动态设置与更新文本TextView 的价值很大一部分体现在动态更新上。通过findViewById或 ViewBinding拿到控件实例后可以随时更新其文本与外观// 获取控件引用推荐使用 ViewBinding避免 findViewById 的类型安全隐患 val textView findViewByIdTextView(R.id.my_text_view) // 动态更新文本内容 textView.text 加载完成共 42 条记录 // 动态修改外观 textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f) textView.setTextColor(ContextCompat.getColor(this, R.color.accent)) textView.setTypeface(Typeface.DEFAULT_BOLD) // 读取当前文本 val current textView.text.toString()Java 等价写法TextView textView findViewById(R.id.my_text_view); textView.setText(加载完成共 42 条记录); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); textView.setTextColor(getColor(R.color.accent));代码方式的典型应用场景包括网络请求返回后展示结果文本根据用户操作切换提示语加载中/成功/失败在RecyclerView适配器的onBindViewHolder中为每个列表项设置内容——这正是路线图中 RecyclerView 与 TextView 最常见的组合用法。动态更新时需要注意频繁修改text会触发测量与重绘在列表滚动场景中应避免在onBindViewHolder里做无必要的重复赋值同时文本内容应使用资源或格式化字符串避免硬编码。让文本可交互点击事件与链接TextView 默认不可点击要让它响应用户点击需要两步在 XML 中设置android:clickabletrue或在代码中调用setClickable(true)在代码中注册点击监听器textView.setOnClickListener { // 处理点击例如跳转详情页或展开全文 Toast.makeText(this, TextView 被点击了, Toast.LENGTH_SHORT).show() }更精细的交互是局部链接使用ClickableSpan可以让一段文本中的特定范围响应点击例如查看服务条款中只有服务条款四个字可点击val spannable SpannableString(我已阅读并同意《服务条款》) spannable.setSpan( object : ClickableSpan() { override fun onClick(widget: View) { // 打开服务条款页面 } override fun updateDrawState(ds: TextPaint) { super.updateDrawState(ds) ds.color ContextCompat.getColor(thisMainActivity, R.color.link) ds.isUnderlineText true } }, start 8, // 子串起始位置 end 13, // 子串结束位置 flags Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) textView.text spannable textView.movementMethod LinkMovementMethod.getInstance() // 关键让点击事件生效其中LinkMovementMethod是让 ClickableSpan 生效的必要条件遗漏它会导致文本虽然看起来可点但实际上不响应。此机制同样适用于路线图中 common-services 等模块中涉及富文本展示的场景。Spans在同一段文本中混排富文本样式原文档特别强调 TextView 支持displaying formatted text using spans使用 spans 显示格式化文本。Spans 是 Android 文本渲染的核心机制一个Spannable对象可以在字符串的不同区间上叠加多种样式标记互不冲突。常用 Span 类型速查Span 类型作用典型场景StyleSpan局部加粗/斜体Typeface.BOLD/ITALIC关键词强调ForegroundColorSpan局部文字颜色高亮错误信息、价格数字BackgroundColorSpan局部背景色标记搜索命中词RelativeSizeSpan局部相对字号如1.5f正文中的大号数字AbsoluteSizeSpan局部绝对字号固定字号混排ClickableSpan局部可点击区域服务条款、链接URLSpan自动生成可点击链接并交由浏览器打开正文中的超链接ImageSpan在文本中内联图片行内 emoji 图标StrikethroughSpan删除线划线价一个组合使用示例——把价格 99.9限时五折中的价格标红加粗val text 今日特价99.9 起 val spannable SpannableString(text) val priceStart text.indexOf() val priceEnd text.indexOf(起) spannable.setSpan( ForegroundColorSpan(Color.parseColor(#E53935)), priceStart, priceEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) spannable.setSpan( StyleSpan(Typeface.BOLD), priceStart, priceEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) textView.text spannable要点总结SpannableString创建后内容不可变但 Span 可增删SpannableStringBuilder支持追加文本与嵌套 Span适合动态拼接setSpan的四个参数依次为 span 对象、起始索引、结束索引、标志位标志位SPAN_EXCLUSIVE_EXCLUSIVE前后不包含、SPAN_EXCLUSIVE_INCLUSIVE后面包含、SPAN_INCLUSIVE_EXCLUSIVE前面包含控制插入/追加文本时 Span 是否跟随推荐用SPAN_EXCLUSIVE_EXCLUSIVE避免样式意外扩散若以EditText承载富文本如 提及、话题高亮Span 的行为会受输入编辑影响此时需要结合输入监听管理。TextView 在 Android 学习路线中的位置在 developer-roadmap 的 Android 路线图 中TextView 与 Button、ImageView、RecyclerView 等控件共同构成传统 View 体系的 UI 基础而 UI 基础又建立在 The Fundamentals 所描述的 Kotlin/Java 语言、面向对象、Gradle 构建与开发环境等前置知识之上。理解 TextView 时可以从这条脉络把握继承关系TextView 继承自View因此具备 View 的所有通用能力——布局参数、可见性控制setVisibility、动画、状态保存等家族扩展Button、EditText、CheckBox、RadioButton等本质上都是 TextView 的子类理解了 TextView 的文本与交互机制就理解了这一整族控件组合实践绝大多数界面 容器LinearLayout/ConstraintLayout TextView/Button/ImageView 等基础控件掌握 TextView 是走向复杂界面构建的第一步。走向 Jetpack Compose从 TextView 到 Text如果采用路线图中并行的 Jetpack Compose 声明式 UI 路线TextView 的对应物是Textcomposable。Compose 不再需要 XML 与 findViewById而是用 Kotlin 函数直接描述界面Text( text Hello, developer-roadmap!, fontSize 18.sp, color MaterialTheme.colorScheme.primary, fontWeight FontWeight.Bold, textAlign TextAlign.Center, maxLines 1, overflow TextOverflow.Ellipsis )传统 TextView 与 Compose Text 的核心差异能力TextViewView 体系TextCompose声明方式XML 布局 findViewByIdKotlin 声明式函数状态更新textView.text ...手动刷新状态驱动重组mutableStateOf自动刷新富文本SpannableString SpanAnnotatedStringSpanStyle/ParagraphStyle点击setOnClickListener/ClickableSpanModifier.clickable/LinkAnnotationCompose 中AnnotatedString是 Spans 的声明式替代例如在buildAnnotatedString中局部上色加粗Text( buildAnnotatedString { append(今日特价) withStyle(SpanStyle(color Color.Red, fontWeight FontWeight.Bold)) { append(99.9) } append( 起) } )结合路线图中的 remember / State 知识可知Compose 中文本内容由状态驱动状态变化触发重组界面自动更新无需像 TextView 那样手动赋值。对于新项目Compose 是推荐路线对于存量 View 项目理解 TextView 仍然是维护与迁移的必备基础。小结TextView 是 Android 文本展示的基石控件它负责静态与动态文本的显示支持字体、颜色、大小、样式等全方位外观定制通过OnClickListener与ClickableSpan提供交互能力并通过 Spans 机制实现单段文本内的富文本混排。掌握 TextView 的 XML/代码双路配置、常用属性语义、Spans 用法与 ComposeText迁移路径是构建任何 Android 界面的第一步。本路线图中与该主题相关的配套资料还包括 Text 与 Compose 文本体系 与 Jetpack Compose 概览可作为继续深入学习的入口。赞分享文档教程知识库【免费下载链接】developer-roadmapInteractive roadmaps, guides and other educational content to help developers grow in their careers.项目地址https://gitcode.com/GitHub_Trending/de/developer-roadmap点击查看免费下载相关推荐nats-server 账户导入导出如何用 subject 映射函数改写消息主题nats server 账户导入导出如何用 subject 映射函数改写消息主题 在 nats server 中做账户隔离时常见的需求是账户 A 导入账户文档教程知识库Notchi钩子系统探秘无缝连接Claude Code与Codex的技术原理Notchi钩子系统探秘无缝连接Claude Code与Codex的技术原理 Notchi钩子系统是实现Claude Code与Codex无缝集成的核心技术一文读懂Phi-3-mini-4k-instruct_rai_1.7.1_npu_4K从模型架构到NPU优化的完整解析一文读懂Phi 3 mini 4k instruct_rai_1.7.1_npu_4K从模型架构到NPU优化的完整解析 想要在AMD Ryzen AI NPU上一篇LunaTranslator 视觉小说实时翻译三步跑通下一篇YOLOv8-Face 人脸检测选型、跑通、微调与部署完整参考创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑