在我们写布局的时候,会出现有些控件或子布局在需要的时候才显示,不需要的时候就消失(这里的消失是指看不见并且不占位置)。常用的做法有两种,一种是直接画在布局中,然后按条件setVisibility(VISIBLE、INVISIBLE、GONE),这种用起来很方便,但是缺点在于在控件或子布局在父布局初始化的时候就已经渲染了,比较耗性能。另一种是使用ViewStub,这种跟前一种能实现同样的功能,但是只有在调用inflate或setVisibility(int)方法的时候才会渲染,降低了资源占用。
<ViewStub android:id="@+id/stub"
//布局加载之后的id
android:inflatedId="@+id/subTree"
//使用布局的Id
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
复制代码
//使用的Java代码
ViewStub stub = (ViewStub) findViewById(R.id.stub);
View inflated = stub.inflate();
复制代码
由于我司在项目中用到许多DataBinging,因此特意研究了下怎么融合DataBinding使用。一共有两种方法可以拿到inflate后layout的viewDataBinding,分别如下。
if (!binding.viewStubRedispatch.isInflated()) {
binding.viewStubRedispatch.getViewStub().inflate();
//1
binding.viewStubRedispatch.setOnInflateListener(new ViewStub.OnInflateListener() {
@Override
public void onInflate(ViewStub stub, View inflated) {
((LayoutBtnRedispatchRepairBinding) DataBindingUtil.bind(inflated)).setOnRedispatchClick(new OnClickHandler());
}
});
//2
((LayoutBtnRedispatchRepairBinding) binding.viewStubRedispatch.getBinding()).setOnRedispatchClick(new OnClickHandler() {
@Override
public void onClick() {
super.onClick();
if (maintainTaskDetailClickListener != null) {
maintainTaskDetailClickListener.onRedispatch();
}
}
});
}
复制代码
通过viewDataBinding.viewStubId拿到的是ViewStubProxy类型的实例。ViewStubProxy在DataBinding包中,主要是为ViewStub的Databinding使用提供帮助。通过getViewStub()方法可以拿到ViewStub实例。通过getBinding可以拿到inflate()之后的layout的ViewDataBinding。