Android UI优化 ViewStub按需加载
2020-03-20 本文已影响0人
天真的小罗罗
ViewStub惰性装载控件
定义
- ViewStub其实是<include/>标签的一个懒加载的优化升级,ViewStub是一个无形的、零大小的视图,在程序运行中,通过懒加载的模式inflate进布局资源中。
- 当ViewStub的inflate()或setVisibility(View. VISIBLE)时,ViewStub使用设定的View才会加载,并替换当前ViewStub的位置。ViewStub存在于视图层次,直到setVisibility(int)或inflate()方法被调用,否则是不加载控件的,所以消耗的资源小,称为懒加载Include。
- ViewStub的好处,在某些场景中,不需要把所有内容展示,可隐藏大部分视图,待需要展示时再加载到Layout中,这时用ViewStub,可减少资源的消耗,使最初的加载速度变快。
- ViewStub可以用于有大量视图隐藏的界面的优化
- 在ViewStub中,需要用到的属性也就两个,Android也为其提供了相应的getter/setter方法:
android:inflateId:重写ViewStub的父布局控件的Id。
android:layout:设置ViewStub被inflate的布局控件Id。 - ViewStub需要监听的事件就只有VIewStub.OnInflateListener,被加载的时候触发,
该Listener需要实现一个onInflate()方法,onInflate(ViewStub stub, View inflated);
stub为当前待加载的ViewStub控件,inflated参数为当前被加载的View视图,可以在其中对其进行一些额外的操作。 - 特别注意:在使用ViewStub的过程中,对于ViewStub,当setVisibility(int)或inflate()方法被调用之后,这个ViewStub在布局中将被使用指定的View替换,所以inflate过一遍的ViewStub,如果被隐藏之后再次想要显示,将不能使用inflate()方法,但是可使用setVisibility(int)方法设置为可见。而inflate()被调用之后,返回的是父布局控件对象。
- ViewStub对象只可以Inflate一次,之后ViewStub对象会被置为空。inflate一个ViewStub对象之后,就不能再inflate它了,否则会报错:ViewStub must have a non-null ViewGroup viewParent
- ViewStub不支持merge标签,意味着你不能引入包含merge标签的布局到ViewStub中。
否则会报错:android.view.InflateException: Binary XML file line #1: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true