6、常用UI控件:TextView、Button、EditText、ImageView、ProgressBar、RecyclerView的基本使用与属性设置
说实话,Android 开发里最常打交道的,就是这几个控件了。我刚入行那会儿,觉得它们太简单,不就是拖拖拽拽嘛。后来才发现,每个控件里都藏着不少门道。今天咱们就一个一个捋清楚。
6.1 TextView — 最基础的文本展示
TextView 说白了就是用来显示文字的。但你别小看它,我见过不少新手在它身上翻车。
核心属性速查:
android:text— 显示的文字内容android:textSize— 字号,建议用 sp 单位android:textColor— 文字颜色android:maxLines— 最大行数,超出显示省略号android:ellipsize— 省略号位置(end / start / middle)android:gravity— 文字对齐方式
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎来到性能优化实战"
android:textSize="18sp"
android:textColor="#333333"
android:maxLines="2"
android:ellipsize="end"
android:gravity="center" />
我的小经验:设置 maxLines 时一定要搭配 ellipsize,否则文字超出后不会显示省略号,直接截断,用户体验很差。我曾经在一个新闻列表里忘了加 ellipsize,结果标题被截了一半,用户根本看不懂。
6.2 Button — 不只是点击
Button 继承自 TextView,所以 TextView 的属性它基本都能用。但 Button 有个默认的样式背景,不同系统版本长得还不一样。
<Button
android:id="@+id/btnSubmit"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="提交"
android:textSize="16sp"
android:background="@drawable/btn_bg_selector" />
注意:直接设置 android:background 会覆盖系统默认的点击态效果。我建议用 Selector 或 MaterialButton 来保持按压反馈。否则用户按下去没反应,会以为手机卡了。
我个人习惯用 MaterialButton,它自带圆角、波纹效果,省心很多。
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSubmit"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="提交"
app:cornerRadius="8dp" />
6.3 EditText — 用户输入的门面
EditText 是用户和 App 交互的重要入口。嗯,这里要注意,输入框的体验直接决定了用户对 App 的第一印象。
| 属性 | 作用 | 常用值 |
|---|---|---|
android:hint |
提示文本 | "请输入用户名" |
android:inputType |
输入类型 | textPassword / number / phone |
android:maxLength |
最大输入长度 | 11 |
android:lines |
固定行数 | 3 |
<EditText
android:id="@+id/etPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号"
android:inputType="phone"
android:maxLength="11"
android:background="@drawable/edit_bg" />
避坑指南:我曾经做过一个登录页面,没设置 inputType,结果用户输入手机号时弹出了全键盘,数字还得切换,体验极差。另外,密码框一定要用 textPassword,否则明文显示密码,用户会骂娘的。
6.4 ImageView — 图片展示的万能容器
ImageView 不只是放图片,它还能做缩放、裁剪、着色。你想想看,一个头像裁剪功能,全靠它了。
<ImageView
android:id="@+id/ivAvatar"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/ic_default_avatar"
android:scaleType="centerCrop"
android:contentDescription="用户头像" />
scaleType 是最容易踩坑的地方。我列几个常用的:
centerCrop— 按比例缩放,裁剪多余部分,适合头像fitCenter— 按比例缩放,完整显示,适合大图fitXY— 拉伸填满,会变形,慎用
注意:用 fitXY 时图片会变形,除非你明确知道自己在做什么,否则别用。我在一个商品详情页里见过用 fitXY 的,好好的商品图被拉成了椭圆,用户直接投诉。
6.5 ProgressBar — 加载中的优雅处理
ProgressBar 分两种:不确定进度(转圈)和确定进度(水平条)。
<!-- 转圈加载 -->
<ProgressBar
android:id="@+id/pbLoading"
android:layout_width="48dp"
android:layout_height="48dp"
android:visibility="gone" />
<!-- 水平进度条 -->
<ProgressBar
android:id="@+id/pbProgress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="8dp"
android:max="100"
android:progress="30" />
我的习惯:加载完成后一定要把 ProgressBar 设为 gone,而不是 invisible。gone 会释放布局空间,invisible 只是隐藏,位置还占着。我曾经因为用了 invisible,导致加载完成后页面底部空了一大块,找了半天 bug。
6.6 RecyclerView — 列表性能之王
RecyclerView 是 Android 开发中最常用的列表控件。说白了,它就是 ListView 的升级版,性能更好,灵活性更高。
使用 RecyclerView 需要三步:
- 在布局中声明 RecyclerView
- 创建 Adapter 和 ViewHolder
- 设置 LayoutManager
// 布局文件
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:padding="8dp" />
// Java/Kotlin 代码
RecyclerView rvList = findViewById(R.id.rvList);
rvList.setLayoutManager(new LinearLayoutManager(this));
rvList.setAdapter(new MyAdapter(dataList));
性能优化要点:
- 一定要用 ViewHolder 模式,避免重复 findViewById
- 设置
setHasFixedSize(true)如果列表大小固定 - 图片加载用 Glide 或 Coil,别自己写
- 嵌套滑动时考虑
NestedScrollView+RecyclerView的性能问题
我曾经踩过的坑:在一个聊天页面里,我忘了设置 setHasFixedSize(true),结果每次插入新消息时 RecyclerView 都要重新测量所有 item,导致滑动卡顿。加上这个属性后,性能提升非常明显。
知识体系总览
下面这张图帮你理清今天讲的六个控件的关系和适用场景:
这六个控件是 Android 开发的基石。你想想看,一个 App 里 80% 的界面都离不开它们。掌握好这些基础,后面学自定义 View 和性能优化时才能游刃有余。
最后说一句:别急着背属性,多用、多试、多踩坑,自然就记住了。我刚开始学的时候,也是边查文档边写代码,慢慢就熟练了。