背景

最近刚好有看到ViewStub,因此根据个人理解记录下笔记。

ViewStub是Android布局优化的方式之一。

它可以让部分布局延迟加载,从而提高页面渲染速度。

场景

因为ViewStub是用于延迟加载使用,因此适用场景是一些不需要即时展示的页面。

举个例子,大家都用过登录页面。

假设第一次你输入登录用户名和密码错误时,第二次输入会要求你输入验证码。

这里的验证码第一次渲染页面时不需要显示,因此可以适用延迟加载场景。

而像用户名和密码输入框因为第一次显示的时候就要求展示在页面上,因此不适合使用ViewStub。

ViewStub和android:visibility="gone"区别

可能大家会好奇,如果ViewStub的作用是延迟加载。

那么如果我把要延迟加载的布局visibility设置为gone不是一样的效果吗?

表面上看起来效果是一样的,但是区别在哪呢?

设置某个布局模块为gone,但是系统在渲染该布局时还是会去计算这个布局模块的宽高等属性,还是会把它添加到布局树上。因此这个布局模块还是会占有渲染布局的部分时间。

而把该布局模块放在ViewStub,系统在渲染该布局时并不会去理ViewStub节点,因此可以节省渲染布局模块的时间。只有当需要展示时,才会去渲染。

ViewStub使用

正如我们之前所说的,ViewStub下的布局是不会展示的。

那么怎么让它展示呢?

  1. 获得ViewStub组件。
    跟其他组件一样通过findViewById(R.id.view_stub)获得mViewStub;
  2. 显示。
    有两种方式:
  • 直接调用
    ​mViewStub.setVisibility(View.VISIBLE);​
  • 通过inflate
    ​mStubView = mViewStub.inflate();​

两种方式的区别在于通过inflate可以返回引用的布局View,可以通过该引用获得布局View的其他组件。

NOTE

inflate只能调用一次,不能调用多次,否则会报错。

因为设置ViewStub可见后,ViewStub就不复存在了。

具体示例Demo可以看​​github Demo​​。

 

扩展阅读:​​ViewStub的具体使用场景,不是万能的​​