目录介绍
01.什么是ViewStub
02.ViewStub构造方法
03.inflate()方法解析
04.WeakReference使用
05.ViewStub为何无大小
06.ViewStub为何不绘制
07.可以多次inflate()吗
08.ViewStub不支持merge
09.ViewStub使用场景
10.ViewStub总结分析
好消息
博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
链接地址:https://github.com/yangchong211/YCBlogs
如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!
01.什么是ViewStub
ViewStub 是一个看不见的,没有大小,不占布局位置的 View,可以用来懒加载布局。
当 ViewStub 变得可见或 inflate()
的时候,布局就会被加载(替换 ViewStub)。因此,ViewStub 一直存在于视图层次结构中直到调用了 setVisibility(int)
或 inflate()
。
在 ViewStub 加载完成后就会被移除,它所占用的空间就会被新的布局替换。
02.ViewStub构造方法
先来看看构造方法:
接下来就看看关键的方法,然后看看初始化状态setVisibility方法。
03.inflate()方法解析
核心来了,平时用的时候,会经常调用到该方法。inflate() 是关键的加载实现,代码如下所示:
Inflate使用特点
ViewStub只能被Inflate一次,inflate之后ViewStub对象就会被置为空。即某个被ViewStub指定的布局被Inflate后,就不能够再通过ViewStub来控制它了。
ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
04.WeakReference使用
05.ViewStub为何无大小
首先先看一段源码,如下所示:
有没有觉得很与众不同
draw和dispatchDraw虽然重写了,但是看代码却都是什么也不做!并且onMeasure还什么也不做,直接setMeasuredDimension(0,0);来把view区域设置位0,原来一个ViewStub虽然是一个view,却是一个没有任何显示内容,也不显示任何内容的特殊view,并且对layout在加载时候不可见的。
06.ViewStub为何不绘制
具体看一下setWillNotDraw(true)方法,代码如下:
View中,对于WILL_NOT_DRAW是这样定义的:
设置WILL_NOT_DRAW之后,onDraw()不会被调用,通过略过绘制的过程,优化了性能。在ViewGroup中,初始化时设置了WILL_NOT_DRAW,代码如下:
所以,在写自定义布局时,如果需要调用onDraw()进行绘制,则需要在初始化时候,调用setWillNotDraw(false)。若是想要更进一步阅读View中WILL_NOT_DRAW的相关源码,可以去看下PFLAG_SKIP_DRAW相关的代码。
07.可以多次inflate()吗
ViewStub对象只可以Inflate一次,之后ViewStub对象会被置为空。同时需要注意的问题是,inflate一个ViewStub对象之后,就不能再inflate它了,否则会报错:ViewStub must have a non-null ViewGroup viewParent。。
其实看一下源码就很好理解:
其实也可以用一张图来理解它,如下所示,摘自网络
也就是说,一旦调用inflate上面的方法后ViewStub就会变成null了,因此使用该对象特别需要注意空指针问题。
08.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
09.ViewStub使用场景
一般的app中大多有这么一个功能,当加载的数据为空时显示一个数据为空的视图、在数据加载失败时显示加载失败对应的UI,当没有网络的时候加载没有网络的UI,并支持点击重试会比白屏的用户体验更好一些。俗称,页面状态切换管理……一般来说,加载中、加载失败、空数据等状态的UI风格,在App内的所有页面中需要保持一致,也就是需要做到全局统一,也支持局部定制。
ViewStub的优势在于在上面的场景中,并不一定需要把所有的内容都展示出来,可以隐藏一些View视图,待用户需要展示的时候再加载到当前的Layout中,这个时候就可以用到ViewStub这个控件了,这样可以减少资源的消耗,使最初的加载速度变快。
那么就有了之前开发使用的状态管理器开源库,就是采用了ViewStub这个控件,让View状态的切换和Activity彻底分离开。用builder模式来自由的添加需要的状态View,可以设置有数据,数据为空,加载数据错误,网络错误,加载中等多种状态,并且支持自定义状态的布局。可以说完全不影响性能……
10.ViewStub总结分析
posted @
2019-11-21 13:52
潇湘剑雨yc
阅读(
1062 )
评论()
编辑
收藏
举报