使用双向Android数据绑定,是否可以使用通用的反布尔转换器?例如,我想做这样的事情:
<Switch android:checked="@={!viewModel.myBoolean}" />
当我在Android中运行时,交换机会快速来回闪烁。我尝试根据George Mount的一些示例创建一个双向绑定app:inverseChecked
但是我没有成功(只是在查看类型'android.widget.Switch'上一直得到错误声明无法找到事件'inverseCheckedAttrChanged' )。
作为比较,使用Aurelia这就像你期望的双向绑定一样。在WPF中,你做的第一个转换器可能是某种InverseBooleanConverter,可以轻松解决这些问题。所以,我假设我只是遗漏了一些明显的东西。
答案 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")