Android:数据绑定:禁用点击
Android: data-binidng: disable click
我想在变量 isAgree
为 false 时禁用点击:
此处代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="handler"
type="myproject.ui.SubscribeBrandDialogFragment" />
</data>
<TextView
android:id="@+id/subscribeTextView"
android:layout_width="185dp"
android:layout_height="40dp"
android:layout_marginTop="@dimen/default_margin"
android:background="@{handler.isAgree ? @drawable/border_enable_bg : @drawable/border_disable_bg}"
android:gravity="center"
android:onClick="@{handler.isAgree ? handler.onClickSubscribe() : null}"
android:textColor="@{handler.isAgree ? @color/color_primary : @color/disable_text_color}" />
</layout>
但我在 android:onClick
中遇到错误:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:onClick' with parameter type void on android.widget.TextView.
file:myproject\layout\subscribe_brand_dialog.xml
loc:100:31 - 100:81
****\ data binding error ****
at android.databinding.tool.processing.Scope.assertNoError(Scope.java:112)
at android.databinding.annotationprocessor.ProcessDataBinding.doProcess(ProcessDataBinding.java:101)
at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:65)
at org.jetbrains.kotlin.kapt3.ProcessorWrapper.process(annotationProcessing.kt:131)
我知道我可以通过 java 代码解决这个问题。但我只想在 xml 布局中解决这个问题。
使用 lambda 表达式。
android:onClick="@{() -> handler.isAgree ? handler.onClickSubscribe() : null}"
嗯,有几件事。
首先,我会按照应有的方式使用控件属性。在点击处理程序上设置 null 并不能正确处理 UI 元素,您只是在胡扯。
您应该根据您的布尔值禁用点击 属性 或焦点 属性,而不是将点击处理程序切换为 null。
其次,通常当您在 xml 单击事件中执行 Terinaray 语句时,我看到使用 handler::methodName 而不是 handler.methodName 以确保它在 属性 中被处理为 onClick 生成数据绑定 类。
最后,如果您已经有了约定的布尔值,为什么不直接在代码中处理点击。如果您考虑的话,您确实为另一行节省了 1 行。
我的点击()
如果(同意)。 //你保存了这个
.
现在你必须这样做
ObservableBoolean<> myBool = new ObservableField()
myBool.set(true/false)
你们中的人正在添加
@Bindable 到一个方法。
无论哪种方式,您都没有通过在 xml 中进行布尔检查来真正保存代码,并且您失去了对其进行单元测试或调试的能力。只是我的两分钱。
我想在变量 isAgree
为 false 时禁用点击:
此处代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="handler"
type="myproject.ui.SubscribeBrandDialogFragment" />
</data>
<TextView
android:id="@+id/subscribeTextView"
android:layout_width="185dp"
android:layout_height="40dp"
android:layout_marginTop="@dimen/default_margin"
android:background="@{handler.isAgree ? @drawable/border_enable_bg : @drawable/border_disable_bg}"
android:gravity="center"
android:onClick="@{handler.isAgree ? handler.onClickSubscribe() : null}"
android:textColor="@{handler.isAgree ? @color/color_primary : @color/disable_text_color}" />
</layout>
但我在 android:onClick
中遇到错误:
e: [kapt] An exception occurred: android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'android:onClick' with parameter type void on android.widget.TextView.
file:myproject\layout\subscribe_brand_dialog.xml
loc:100:31 - 100:81
****\ data binding error ****
at android.databinding.tool.processing.Scope.assertNoError(Scope.java:112)
at android.databinding.annotationprocessor.ProcessDataBinding.doProcess(ProcessDataBinding.java:101)
at android.databinding.annotationprocessor.ProcessDataBinding.process(ProcessDataBinding.java:65)
at org.jetbrains.kotlin.kapt3.ProcessorWrapper.process(annotationProcessing.kt:131)
我知道我可以通过 java 代码解决这个问题。但我只想在 xml 布局中解决这个问题。
使用 lambda 表达式。
android:onClick="@{() -> handler.isAgree ? handler.onClickSubscribe() : null}"
嗯,有几件事。 首先,我会按照应有的方式使用控件属性。在点击处理程序上设置 null 并不能正确处理 UI 元素,您只是在胡扯。
您应该根据您的布尔值禁用点击 属性 或焦点 属性,而不是将点击处理程序切换为 null。
其次,通常当您在 xml 单击事件中执行 Terinaray 语句时,我看到使用 handler::methodName 而不是 handler.methodName 以确保它在 属性 中被处理为 onClick 生成数据绑定 类。
最后,如果您已经有了约定的布尔值,为什么不直接在代码中处理点击。如果您考虑的话,您确实为另一行节省了 1 行。
我的点击() 如果(同意)。 //你保存了这个 . 现在你必须这样做 ObservableBoolean<> myBool = new ObservableField() myBool.set(true/false)
你们中的人正在添加 @Bindable 到一个方法。 无论哪种方式,您都没有通过在 xml 中进行布尔检查来真正保存代码,并且您失去了对其进行单元测试或调试的能力。只是我的两分钱。