我在我的项目中使用数据绑定,我有一个用于从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
延伸,因此我看起来没有办法实现此目的。
有没有解决方法,或者我是否被迫以编程方式设置此包含布局的可见性?我知道这会有效,但如果可能的话,我真的希望将它保留在数据绑定中。
答案 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)
显然,当前您无法将BindingAdapters
与included
布局元素一起使用,但是可以在包含的布局中传递变量(以便它们处理)。
keshav Aggarwal提出的建议几乎可以。您将必须传递included
布局内的数据,但是不必暴露整个ViewModel
布局内的数据,而且有点不雅致。
my_include_layout
,添加带有绑定参数的变量。<layout>
<data>
<variable
name="visibilityCondition"
type="<the_type_of_the_visibility>"/>
</data>
<View
app:visibilityCondition="@{visibilityCondition}"/>
</layout>
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"/>