Android ViewStub的基本使用

本文探讨了在布局设计中使用ViewStub替代常规控件显示隐藏操作的优势,特别是在性能优化方面。通过两种方法介绍了如何在DataBinding环境中利用ViewStub,以实现延迟加载布局并减少资源消耗。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值