移动开发

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,而不会影响性能 🚀。

留言

您的邮箱地址不会被公开。 必填项已用 * 标注