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 中进行布尔检查来真正保存代码,并且您失去了对其进行单元测试或调试的能力。只是我的两分钱。