使用双向数据绑定的逆布尔值

问题描述:

使用双向Android数据绑定,是否有可能具有通用逆布尔转换器?例如,我想要做这样的事情:使用双向数据绑定的逆布尔值

<Switch android:checked="@={!viewModel.myBoolean}" /> 

当我在Android中执行此操作时,交换机只是快速地来回发射。我尝试创建一个双向绑定app:inverseChecked,下面是来自George Mount的一些示例,但我没有成功(只是不断收到错误,指出无法在View类型'android.widget.Switch')上找到事件'inverseCheckedAttrChanged'。

作为一个比较,使用Aurelia这只是作为你所期望的双向绑定。在WPF中,可能你制作的第一个转换器是某种InverseBooleanConverter,可以轻松解决这些问题。所以,我假设我在这里错过了一些明显的东西。

我其实并没有指望它能够工作。我认为,它总是来回切换,因为绑定不会应用绑定表达式的反函数。

这就是说,我测试了当前数据绑定库版本的行为并检查了生成的源代码。通过android:checked这个简单的例子,这些节目会记录倒数应该是什么样子并适当地应用它。

而且乔治·芒写了一个博客文章关于它的前一段时间:https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

如果试图实现一个app:inverseChecked,你还不得不实施设置@BindingAdapter("inverseChecked")作为二传手,@InverseBindingAdapter(attribute="inverseChecked")作为getter和@BindingAdapter("inverseCheckedAttrChanged")改变听众。

后者可能看起来像以下:

@BindingAdapter("inverseCheckedAttrChanged") 
public static void setupInverseCheckedAttrChanged(Switch view, InverseBindingListener listener) { 
    OnCheckedChangeListener newListener = null; 
    if (listener != null) { 
     newListener = (v,b) -> listener.onChange(); 
    } 
    view.setOnCheckedChangeListener(newListener); 
}