使用场景
当一块布局 有时候不需要展现 有时候需要展现 或者根据不同场景需要展现不同样式
通常的解决方案就是:就是把可能用到的View先写在布局里,再初始化其可见性都设为View.GONE,然后在代码中根据数据动态的更改它的可见性。
虽然这样的实现,逻辑简单而且控制起来比较灵活;但是也存在一定的缺点耗费资源。
因为即使把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,故而:
(1)仍然会创建对象;
(2)仍然会被实例化;
(3)仍然会被设置属性从而导致耗费内存等资源。
此时可以使用懒加载去处理 减少资源消耗和初始化时间
使用方法
先在布局中使用ViewStub 当作占位符
(1)ViewStub一个是直接继承于View的类。
(2)实质上是一个宽高都为 0 的不可见 View。
注意设置宽高不要使用match_parent 否则会将整个页面都覆盖
在需要让其显示的地方 为其注入对应的布局文件 使用setLayoutResource(R.layout.*)
方法
注意: 注入对应的布局后 需要调用inflate()方法 才会生效
一般会定义一个View对象 View v = viewStub.inflate();
接收注入后的对象
后续需要修改使用layout内的布局时 只需要使用v.findViewById(R.id.*)
找到内部布局
对 inflate() 操作也只能进行一次,因为 inflate() 的时候是其指向的布局文件替换掉当前 标签。之后, 原来的布局文件中就没有 标签了。因此,如果多次 inflate() 操作,会报错:ViewStub must have a non-null ViewGroup viewParent。
还可以设定 Visibility 为 VISIBLE 或 INVISIBLE,也会触发 inflate()。 但是这里只会在首次使用 setVisibility() 会加载要渲染的布局文件。再次使用只是单纯的设置可见性。