通常开发中,界面的显示通常都会有:加载中,网络错误,数据为空等多种状态,这些状态只有在某些情况下才显示,如果用View.setVisibility来控制的话,即使不显示也会占用资源,而用ViewStub可以在用到时再去加载资源.
ViewStub介绍
ViewStub 是一个轻量级的View,Inflate之前不显示,占用资源非常小。当ViewStub被设置为可见的时候,或是调用了ViewStub.inflate()的时候,ViewStub所指向向的布局就会被Inflate实例化,并替换掉ViewStub, ViewStub的layout params会传给它所指向的布局.
特点:
-
- ViewStub只能Inflate一次,之后ViewStub对象会被置为空。按句话说,某个被ViewStub指定的布局被Inflate后,就不会够再通过ViewStub来控制它了。
-
- ViewStub只能用来Inflate一个布局文件,而不是某个具体的View,当然也可以把View写在某个布局文件中。
用法:
layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/toolbar_root"
>
<ViewStub
android:id="@+id/view_stub_error"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/stub_net_error"
/>
</RelativeLayout>
</RelativeLayout>
stub_net_error.xml
<com.fly.tour.common.view.NetErrorView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_net_error"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
通过ViewStub.inflate和setVisibility控制网络错误界面的显示与否
mViewStubError = findViewById(R.id.view_stub_error);
public void showNetWorkErrView(boolean show) {
if (mNetErrorView == null) {
View view = mViewStubError.inflate();
mNetErrorView = view.findViewById(R.id.view_net_error);
mNetErrorView.setRefreshBtnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!NetUtil.checkNetToast()) {
return;
}
showNetWorkErrView(false);
initData();
}
});
}
mNetErrorView.setVisibility(show ? View.VISIBLE : View.GONE);
}