android-binding:onclick取决于变量

时间:2018-08-01 09:04:51

标签: android-databinding

我需要在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)

2 个答案:

答案 0 :(得分:1)

  

找不到带有参数的属性“ android:onClick”的设置器   在android.widget.TextView上输入void

这是什么意思?确实是个问题!

如果您未在onClick中编写 ()-> ,则必须将View类型作为方法中的第一个参数。

解决方案

将onClick行更改为下方。

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

然后将TextView设置为onClickSubscribeonClickUnsubscribe的第一个参数。

void onClickSubscribe (TextView tv) {
...
}

&与onClickUnsubscribe相同

全部完成!

我喜欢快捷方式,所以这里是提示

使用Boolean设置通用方法。

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

并称呼它

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

因此,您的两种方法都简化为1。

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

答案 1 :(得分:0)

您可以使用此:

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

一开始不要忘记()->