官方文档地址:https://developer.android.com/reference/android/view/ViewStub.html
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate();
以上为google翻译过的原网页,大概意思还是能看明白的。
个人理解为懒加载的include标签,即不会立即加载视图,在调用setVisibility或inflate后才会加载视图。
比如页面有个弹出view做提示用,需要从服务器获取数据来展示,这个数据若为空则不展示,就可以使用Viewstub来实现,若服务器返回数据为空则不进行操作,有数据时再进行viewstub相关的操作。
viewStub.inflate()方法只可调用一次,多次调用会抛出异常(解决方法如下代码)。若只是进行展示/隐藏则直接调用setVisibility,无需使用inflate方法;若需要对替换后的视图进行操作则可使用inflate方法,其会返回替换后的视图。
//第一种
private View newLayout;
public void show(View view) {
if(newLayout == null){
newLayout = viewStub.inflate();
}else{
viewStub.setVisibility(View.VISIBLE);
}
}
//第二种
public void show(View view) {
try {
viewStub.inflate();
} catch (IllegalStateException e) {
viewStub.setVisibility(View.VISIBLE);
}
}