欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android ViewStub的基本使用

程序员文章站 2022-03-20 12:49:32
...

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

转载于:https://juejin.im/post/5c6ab2f1f265da2d9e17497f