使用双向数据绑定的反向布尔

时间:2016-07-06 22:10:46

标签: android android-databinding

使用双向Android数据绑定,是否可以使用通用的反布尔转换器?例如,我想做这样的事情:

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

当我在Android中运行时,交换机会快速来回闪烁。我尝试根据George Mount的一些示例创建一个双向绑定app:inverseChecked但是我没有成功(只是在查看类型'android.widget.Switch'上一直得到错误声明无法找到事件'inverseCheckedAttrChanged' )。

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

1 个答案:

答案 0 :(得分:1)

我实际上并没想到它会起作用。我假设,它一直在来回切换,因为绑定不应用绑定表达式的反函数。

也就是说,我使用当前数据绑定库版本测试了行为并检查了生成的源。通过android:checked的简单示例,这些示例说明了反转应该是什么样子并适当地应用它。

不久前乔治·芒(George Mount)写了一篇关于它的博客文章:https://medium.com/google-developers/android-data-binding-inverse-functions-95aab4b11873

如果您尝试实施app:inverseChecked,则还需要将@BindingAdapter("inverseChecked")设置为setter,将@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); } 以设置更改侦听器

后者可能如下所示:

Alamofire.request(getLoginURL(), method: .post, parameters: postData, encoding: URLEncoding.default, headers: headers).responseString { response in

        switch response.result {

        case .success:


            guard let serverResponse = response.result.value else {
                print("Could not connect to server")
                return
            }



            let decodedMessage = getDecodedMessage(serverResponse: serverResponse)
            print(decodedMessage)
            print("")

            let serverSignature = getSignature(serverMessage: serverResponse)

            let computedSignature = encodeHMAC(signatureKey: signatureKey, xml: decodedMessage)

            print(serverSignature)
            print(computedSignature)

            if computedSignature == serverSignature {
                print("they are the same")
            }else {
                print("they are not the same")
            }

            let responseCode = getReponseCode(decodedMessage: decodedMessage)
            if responseCode == 1137 {
                print("Success")
                self.goToDashBoard(decodedMessage: decodedMessage)
            }else {
                print("failure")
            }




        case.failure :
            print("request failed")