Android ViewStub的基本使用

1,907 阅读1分钟

在我们写布局的时候,会出现有些控件或子布局在需要的时候才显示,不需要的时候就消失(这里的消失是指看不见并且不占位置)。常用的做法有两种,一种是直接画在布局中,然后按条件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。