本节摘要:TextView 负责显示不可编辑文本,EditText 继承它并增加输入能力。掌握 TextView 的 maxLines/ellipsize/textColor/gravity 与 EditText 的 inputType/hint/maxLength,就能解决界面上八成的文本问题。本节同时给出猜数字 App 的标题与输入框的完整配置。
TextView 看着是全 Android 最简单的控件,实际项目里它坑最多——长文本溢出、行数爆炸、对不齐。先看一份带齐高频属性的配置:
<TextView android:id="@+id/tv_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hint_input" android:textColor="@color/text_main" android:textSize="@dimen/body_size" android:maxLines="2" android:ellipsize="end" android:gravity="center" android:lineSpacingExtra="4dp" />
逐个说关键的几个。maxLines="2" 限制最多两行——没有它,一条长提示能把整个界面顶变形。ellipsize="end" 让超出的文字以省略号结尾;两端对齐、跑马灯等都是它的取值,但日常 90% 用 end。gravity="center" 管的是文字在控件内部的摆放位置,和 4 章要讲的 layout_gravity(控件在父容器里的位置)是一对最容易混淆的属性,现在先立个记号。
在代码里改文字是最高频的操作,Kotlin 里用属性赋值语法:
binding.tvResult.text = "太大了,往小猜" binding.tvResult.setTextColor(ContextCompat.getColor(this, R.color.success)) // 富文本:一部分变色,比如"猜对了"三个字单独标绿 val span = SpannableString("猜对了!共 5 次") span.setSpan(ForegroundColorSpan(0xFF2E7D32.toInt()), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) binding.tvResult.text = span
EditText 在 TextView 的基础上加了键盘与光标。最重要的属性是 inputType,它同时决定键盘形态与校验行为:
<EditText android:id="@+id/et_guess" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入 1 到 100 之间的整数" android:inputType="number" android:maxLength="3" android:imeOptions="actionDone" />
inputType="number" 弹出纯数字键盘,用户想输字母都没机会——能用键盘形态挡住的错误,就不要留到代码里再报错。maxLength="3" 从源头限住最多三位数。imeOptions="actionDone" 把软键盘回车键换成"完成",配合代码监听这个动作,用户可以不碰按钮直接提交:
binding.etGuess.setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE) { doGuess() true // 消费掉事件,键盘收起 } else false }
读取输入时永远走安全路径:text.toString().toIntOrNull(),空串与非法输入返回 null,比 toInt() 直接崩溃优雅得多。这个细节在 1.3 节的 when 分支里已经用过,这里点明它是刻意设计。

⚠️ 常见坑:
android:singleLine="true"已被标记废弃,新代码用maxLines="1"加inputType的组合;另外 hint 颜色太浅会撞上 2.3 节的对比度红线,默认灰通常需要加深一档。
TextView 能点吗? 默认不可点,但它本质上就是 View,加上 isClickable 或直接 setOnClickListener 就能响应点击。点击跳转协议链接的场景则更推荐让系统自动识别,不过那要牵扯 MovementMethod,入门阶段知道有这条路即可。EditText 能不能禁止粘贴? 能,但先问自己为什么要禁——多数禁粘贴需求其实是输入校验没做好的遮羞布,把校验做好比限制用户操作更体面。为什么我的 hint 不换行? 检查是否同时设了 maxLines 为 1,hint 与正文共享行数限制,这是配置冲突而不是控件缺陷。这三个问题的共同解法值得记住:控件的表现异常,先查自己的属性组合,再怀疑控件本身——Android 的基础控件经过十几年的千锤百炼,背锅的多数是配置。