Android ViewStub 使用
ViewStub 是 Android 提供的一个轻量级 View,用于延迟加载布局,优化性能。它在 XML 中定义时不会立即占用资源,只有在 inflate() 之后才会真正创建和添加视图。
1. ViewStub 的使用场景
适用于以下情况:
• 减少初始化开销:仅在需要时加载 UI 组件,避免初始化大量视图。
• 优化性能:减少 View 层级,特别适用于复杂的 RecyclerView 项布局。
• 动态布局:可以根据不同的状态动态加载布局,如错误提示页、加载状态页等。
2. ViewStub 的基本用法
(1)在 XML 中定义
<ViewStub android:id="@+id/viewStub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/layout_stub_content"/>
• android:id:唯一 ID,用于在代码中引用。
• android:layout:延迟加载的布局文件路径。
• layout_width / layout_height:可以设置具体尺寸,也可以使用 wrap_content。
(2)在代码中动态加载
val viewStub = findViewById<ViewStub>(R.id.viewStub) val inflatedView = viewStub.inflate() // 加载布局,并返回根 View
• inflate() 方法会将 ViewStub 替换成实际的布局,并返回根 View。
• 调用 inflate() 后,ViewStub 本身会被移除,不再占用内存。
获取子控件
val textView = inflatedView.findViewById<TextView>(R.id.textView) textView.text = "ViewStub 加载成功!"
3. 使用 setVisibility() 显示 ViewStub
可以使用 setVisibility(View.VISIBLE) 来触发 inflate():
viewStub.visibility = View.VISIBLE // 内部会自动调用 inflate()
注意:
• ViewStub 只能 inflate() 一次,之后会被移除,不能再 setVisibility(View.GONE) 再次显示。
如果需要 多次切换 视图,可以这样做:
if (viewStub.parent != null) { viewStub.inflate() // 只在第一次加载 } else { inflatedView.visibility = View.VISIBLE // 之后直接显示 }
4. 示例:点击按钮显示 ViewStub
XML 布局
<Button android:id="@+id/btnShow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示 ViewStub" /> <ViewStub android:id="@+id/viewStub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/layout_stub_content"/>
Kotlin 代码
val btnShow = findViewById<Button>(R.id.btnShow) val viewStub = findViewById<ViewStub>(R.id.viewStub) btnShow.setOnClickListener { if (viewStub.parent != null) { val inflatedView = viewStub.inflate() // 加载布局 val textView = inflatedView.findViewById<TextView>(R.id.textView) textView.text = "ViewStub 已加载" } }
5. 总结
• ViewStub 初始不会占用资源,可以提高性能。
• inflate() 会移除 ViewStub 本身,不能再次 setVisibility(View.GONE) 再次显示。
• 适用于 动态布局、状态切换(如空页面、错误页面)。
• 不适用于 需要频繁切换的 UI,可改用 ViewSwitcher 或 View.setVisibility()。
这样,你可以在需要时加载 UI,而不会影响性能 🚀。