介绍:
ViewStub就是一个宽高都为0的一个View,它默认是不可见的。只有通过调用 setVisibility() 函数或者 Inflate() 函数才会将其要装载的目标布局给加载出来,从而达到延迟加载的效果。在ViewStub布局可显示之前,系统不会消耗资源去实例化里面的布局,可以节省系统资源消耗。
使用:
<ViewStub
android:id="@+id/viewstub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inflatedId="@+id/inflatedview"
android:layout="@layout/net_error_view"/>
使用下面的两种方式来加载ViewStup并获取布局控件
private View netErrorView;
ViewStub viewStub = (ViewStub) findViewById(R.id.viewstub);
netErrorView = viewStub.inflate();
viewStub.setVisibility(View.VISIBLE);
netErrorView = findViewById(R.id.inflatedview);
在使用第一种方式的时候,如果获取到viewStub对象并调用inflate来加载viewStub之后,viewStub就消失了,如果这时候还通过viewStub对象来进行操作就会报空指针的错误,所以“ViewStub viewStub = (ViewStub) findViewById(R.id.viewstub);”这句话只能执行一次。
另外说明一下在使用过程中遇到的两个错误:
1、must have a valid layoutResource
布局中layout标签用错了
将layout="@layout/net_error_view"
改为android:layout="@layout/net_error_view"
2、ViewStub must have a non-null ViewGroup viewParent
这就是上面提到的问题了,ViewStub在加载了之后就变为空了。
网友评论