应用数据绑定适配器以包含标记

时间:2018-06-06 14:20:58

标签: android android-databinding

我在我的项目中使用数据绑定,我有一个用于从viewmodel设置可见性条件:

<View
   app:visibilityCondition="@{viewModel.showingItems}" />

这一切都很好,但是当我想在包含这样的包含标签时使用它时突然:

<include
   layout="@layout/my_include_layout
   app:visibilityCondition="@{viewModel.showingItems}" />

它没有构建,出现以下错误:

  

e:[kapt]发生异常:android.databinding.tool.util.LoggedErrorException:发现数据绑定错误。   在com.example.CustomBinding上找不到参数类型为boolean的属性'app:visibilityCondition'的setter。

由于CustomBinding类实际上并未从View延伸,而是从ViewDataBinding延伸,因此我看起来没有办法实现此目的。

有没有解决方法,或者我是否被迫以编程方式设置此包含布局的可见性?我知道这会有效,但如果可能的话,我真的希望将它保留在数据绑定中。

3 个答案:

答案 0 :(得分:1)

因此,如果您希望在布局中使用include时数据绑定能够正常工作,那么有一些问题,请执行以下操作:

第1步:将您正在使用include标记的xml文件更改为此类似的内容。仔细看看我如何使用此数据绑定中的变量名称。

<data>
     <import type="com.example.jenny.MyViewModel"/>
     <variable
         name="viewModelNew"
         type="MyViewModel"/>

      <include
         layout="@layout/my_include_layout
         app:viewModel="@{viewModelNew}"/> <!--this, viewModel is the variable declared in xml which you are including here-->
</data>

第2步:在您所包含的布局中,即在my_include_layout中,按照以下方式执行Real Data Binding:

<data>
    <import type="com.example.jenny.MyViewModel"/>
    <variable
        name="viewModel"
        type="MyViewModel"/>
</data>

  <View
     app:visibilityCondition="@{viewModel.showingItems}"/><!--the real Data Binding is happening here-->

第3步:此外,在您的活动或片段中,无论您在哪里初始化数据绑定,都要写

dataBinding.viewModelNew = new MyViewModel() // or something like this, you have to initialze the data binding variable

如果有帮助,请告诉我。

答案 1 :(得分:1)

显然,当前您无法将BindingAdaptersincluded布局元素一起使用,但是可以在包含的布局中传递变量(以便它们处理)。

keshav Aggarwal提出的建议几乎可以。您将必须传递included布局内的数据,但是不必暴露整个ViewModel布局内的数据,而且有点不雅致。

  1. 修改my_include_layout,添加带有绑定参数的变量。
<layout>
    <data>
        <variable
            name="visibilityCondition"
            type="<the_type_of_the_visibility>"/>
    </data>
    <View
        app:visibilityCondition="@{visibilityCondition}"/>
</layout>
  1. 使用bind命名空间在included布局内传递可见性参数:
<include
   layout="@layout/my_include_layout
   bind:visibilityCondition="@{viewModel.showingItems}" />

答案 2 :(得分:-1)

假设您所包含的布局仍设置基于viewModel的可见性条件,如第一个代码段所示,然后必须有<data>部分定义viewModel,我通常会这样做do在include语句中设置。例如:

<include
    bind:viewModel="@{viewModel}"
    layout="@layout/my_include_layout"/>