ViewStub好用是好用,但是得会用

本文介绍了ViewStub在Android开发中的应用场景及使用方法。ViewStub适用于布局需要动态选择可见性的场合,可以有效减少不必要的布局绘制,特别是在Adapter中处理复杂布局时特别有用。

1.ViewStub的使用场景

    ViewStub适合适用于布局需要您选择 visible或者gone 的时候,如果只是单纯的设置可见不可见 其实布局还是会得到绘制,但是ViewStub的存在解决了这个问题,只有再ViewStub设置可见或者inflate的时候 才会可见。

一般我们在 adapter中可能存在比较复杂的布局,我们只把需要显示的布局绘制出来就要用到ViewStub.

2.ViewStub的使用

  View iv_vsContent = viewHolder.viewStub1.inflate(); //inflate 方法只能被调用一次

  RelativeLayout cardView = iv_vsContent.findViewById(R.id.rv_rl);

`ViewStub` 是 Android 中的一个轻量级的视图组件,它是一个**不可见的、无尺寸的视图**,主要用于**延迟加载布局资源**。当你需要在运行时根据条件加载某个布局时,可以先使用 `ViewStub` 占位,等到需要时再加载实际的布局,从而提高界面初始化的性能。 --- ### 一、ViewStub 的特点 - **不可见**:初始状态下 `ViewStub` 是不可见的(`visibility = GONE`)。 - **不占用布局层级**:在未加载时不会参与布局计算。 - **延迟加载**:只有在需要时才会加载指定的布局文件。 - **节省资源**:避免一次性加载不必要的布局,提升启动速度。 --- ### 二、ViewStub 的使用方式 #### 1. 在 XML 中定义 ViewStub ```xml <ViewStub android:id="@+id/view_stub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/skeleton_layout" /> ``` - `android:layout`:指定要延迟加载的布局资源。 #### 2. 在 Java/Kotlin 中加载布局 ```java ViewStub stub = findViewById(R.id.view_stub); View inflatedView = stub.inflate(); // 加载布局并返回根视图 ``` > 注意:`inflate()` 方法只能调用一次,之后 `ViewStub` 会被替换为实际加载的布局。 --- ### 三、ViewStub 的适用场景 - **骨架屏(Skeleton Screen)**:在数据加载完成前显示一个占位布局。 - **动态界面切换**:比如根据用户权限显示不同的内容。 - **性能优化**:避免一次性加载过多视图,提升页面初始化速度。 --- ### 四、ViewStub 的优缺点 | 优点 | 缺点 | |------|------| | 延迟加载,提升性能 | 加载后不可重复使用 | | 简化布局结构 | 无法获取未加载布局中的子视图 | | 减少内存占用 | 不支持 `merge` 标签作为子布局 | --- ### 五、ViewStub 与 GONE 布局的区别 | 对比项 | ViewStub | GONE 布局 | |--------|----------|-----------| | 是否参与布局 | 否 | 是(只是不可见) | | 是否消耗资源 | 否(未加载) | 是(即使不可见也已加载) | | 是否可重复加载 | 否(加载后替换) | 是(可反复设置 `VISIBLE` / `GONE`) | --- ### 六、示例代码:使用 ViewStub 实现骨架屏 #### XML: ```xml <LinearLayout ...> <!-- 骨架屏占位 --> <ViewStub android:id="@+id/skeleton_stub" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout="@layout/skeleton_home" /> <!-- 真实内容 --> <FrameLayout android:id="@+id/content_container" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" /> </LinearLayout> ``` #### Java: ```java ViewStub stub = findViewById(R.id.skeleton_stub); stub.inflate(); // 模拟数据加载完成后隐藏骨架屏,显示真实内容 new Handler(Looper.getMainLooper()).postDelayed(() -> { findViewById(R.id.skeleton_stub).setVisibility(View.GONE); findViewById(R.id.content_container).setVisibility(View.VISIBLE); }, 2000); ``` --- ### 七、总结 `ViewStub` 是一个非常实用的控件,尤其适用于需要**延迟加载**的场景,如骨架屏、条件性界面等。它通过延迟加载视图来减少初始布局的复杂度,从而提升页面的加载速度和性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值