ViewStub更加轻量级,它本身是一个不可见的 View,资源消耗比较小,只有调用了ViewStub.inflate()的时候加载布局,布局才会实例化。
下面我们直接进行源码分析:
接下来分析setVisibility方法
通过上面的代码分析我们可以得出 setVisibility 最后调用的还是 inflate,所以这个方法才是关键
接下来看inflateViewNoAdd方法:
接着看replaceSelfWithView方法
最后总结一下:
ViewStub通过设置Gone以及设置宽和高都为0,以及setWillNotDraw(true)来达到自己不绘制不渲染的效果,其实就是占一个坑位意思。
ViewStub只能调用一次setVisibility方法,而setVisibility最后还是调用inflate方法,在replaceSelfWithView中indexOfChild代码中,如果ViewStub被移除了以后,index则是-1,那么addView的时候会抛出异常的。
网友评论