开发过程中我们可能为了优化布局,会采用viewstub这种懒加载的方式, 当我们同时使用databinding的时候,布局应该怎么写呢?
<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="vm"
type="com.daniu.scrm.mine.viewmodel.MinePermissionViewModule" />
</data>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<include layout="@layout/base_titlebar_whitebg_no_shadow" />
<com.daniu.scrm.base_module.view.LoadingLayoutView
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--这里给viewstub使用自定义标签, bind:vm, 将它需要的viewmodel数据传入--->
<ViewStub
bind:vm ="@{vm}"
android:id="@+id/qrcode_viewstub"
android:layout="@layout/mine_viewstub_wechat_qrcode"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.daniu.scrm.base_module.view.LoadingLayoutView>
</LinearLayout>
</layout>
viewstub中的布局: 变量名要与自定义的变量名保持一致, 剩余的就可以按照平时的使用正常使用了
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<!-- 这里的变量名要与上面自定义的变量名保持一致-->
<variable
name="vm"
type="com.daniu.scrm.mine.viewmodel.MinePermissionViewModule" />
</data>
<RelativeLayout
android:id="@+id/rl_qrcode"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
app:loadImg="@{vm.qrCodeurl}"
android:id="@+id/iv_code_img"
android:layout_width="@dimen/base_wh164.0dimens164.0dp"
android:layout_height="@dimen/base_wh164.0dimens164.0dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/base_wh50.0dimens50.0dp" />
<TextView
android:id="@+id/step"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/iv_code_img"
android:layout_marginLeft="@dimen/base_wh53.0dimens53.0dp"
android:layout_marginTop="@dimen/base_wh40.0dimens40.0dp"
android:text="操作步骤 : "
android:textColor="@color/color_333333"
android:textSize="@dimen/base_wh16.0dimens16.0dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/step"
android:layout_marginLeft="@dimen/base_wh10.0dimens10.0dp"
android:layout_toRightOf="@+id/step"
android:lineHeight="@dimen/base_wh24.0dimens24.0dp"
android:text="1 截图把二维码发到其他群 \n2 用工作为先扫一扫点击登录\n3 大牛买车将继续工作"
android:textColor="@color/color_333333"
android:textSize="@dimen/base_wh14.0dimens14.0dp" />
</RelativeLayout>
</layout>
在activity中viewstub的inflate与数据绑定:
lateinit var viewDataBinding: MineActivityManagePermissionBinding
override fun initViews() {
viewDataBinding = DataBindingUtil.setContentView<ViewDataBinding>(this, R.layout.mine_activity_manage_permission) as MineActivityManagePermissionBinding
viewDataBinding.setVariable(BR.vm, mViewModel)
}
fun inflateView(){
//viewstub只能被inflate一次
if (!viewDataBinding.loginedViewstub.isInflated) {
viewDataBinding.loginedViewstub.viewStub?.inflate()
}
viewDataBinding.loginedViewstub.setOnInflateListener { stub, inflated ->
val loginedViewDatabinding = DataBindingUtil.bind<ViewDataBinding>(inflated)
//绑定数据到viewstub
loginedViewDatabinding?.setVariable(BR.vm, mViewModel)
}
}
网友评论