android-绑定:onclick 取决于变量

android-binding: onclick depend on variable

我需要当 isFavorite 为 true 然后当点击然后调用 onClickSubscribe() 否则调用 onClickUnsubscribe().

在我的片段中:

  @Override
    public void onClickSubscribe() {

    }

在我的 xml:

    <?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="SubscribeBrandDialogFragment" />

        </data>


         <TextView
                android:id="@+id/subscribeTextView"
                android:layout_width="185dp"
                android:layout_height="40dp" 
                android:onClick="@{handler.isFavorite ? handler.onClickSubscribe() : handler.onClickUnsubscribe()}"
                android:text="@{handler.isFavorite ? @string/unsubscribe : @string/subscribe}"/>

    </layout>

但是我得到错误:

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:res\layout\subscribe_brand_dialog.xml
loc:100:31 - 100:108
****\ data binding error ****

    at android.databinding.tool.processing.Scope.assertNoError(Scope.java:112)

Cannot find the setter for attribute 'android:onClick' with parameter type void on android.widget.TextView

这是什么意思?这就是问题所在!

如果你不在你的 onClick 中写 ()-> 那么你必须将你的视图类型作为方法中的第一个参数。

解决方案

将 onClick 行更改为下面。

android:onClick="@{handler.isFavorite ? handler::onClickSubscribe : handler::onClickUnsubscribe}"

并设置 TextView 作为 onClickSubscribe & onClickUnsubscribe 的第一个参数。

void onClickSubscribe (TextView tv) {
...
}

& onClickUnsubscribe

相同

全部完成!

我喜欢捷径,所以这是提示

Boolean做一个通用方法。

void onSubscribe(boolean isSubscribe){
   if(isSubscribe){}
   else {}
}

并这样称呼它

android:onClick="@{() -> handler.onSubscribe(handler.isFavorite)}"

所以你的两个方法就减少到1个了

如果您需要传递任何其他值,只需更改 onSubscribe 的参数即可。并从 xml.

传递

你可以使用这个:

android:onClick="@{()->handler.isFavorite ? handler.onClickSubscribe() : handler.onClickUnsubscribe()}"  

首先不要忘记()->