Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用BindingAdapter时,数据绑定器无法识别lambda中的类型化参数_Android_Kotlin_Android Databinding - Fatal编程技术网

Android 使用BindingAdapter时,数据绑定器无法识别lambda中的类型化参数

Android 使用BindingAdapter时,数据绑定器无法识别lambda中的类型化参数,android,kotlin,android-databinding,Android,Kotlin,Android Databinding,我正在尝试绑定以下元素: xml: 使用BindingAdapter: @BindingAdapter("onCheckedChanged") fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Boolean) -> Unit) { view.setOnCheckedChangeListener( { _, isChecked -> if (view.isPr

我正在尝试绑定以下元素:

xml:

使用BindingAdapter:

@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Boolean) -> Unit) {
    view.setOnCheckedChangeListener(
        { _, isChecked ->
            if (view.isPressed) onCheckedChanged(isChecked)
        }
    )
}
我得到的错误是:

数据绑定错误****消息:找不到方法 类中的onCheckedChanged(java.lang.Object) MyViewModel

数据绑定器似乎无法将
isChecked
识别为
Boolean
。我试图强制在xml中键入,比如
isChecked:Boolean
,但我得到了一系列不同的错误

现在,我使用
Any
而不是
Boolean
使它工作起来,但我觉得这是错误的:

@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Any) -> Unit) {
    ...

有人知道如何使用正确的函数签名吗?

根据:“事件处理程序只能与带有一个抽象方法的接口或抽象类一起使用,如下例所示:

@BindingAdapter("android:onLayoutChange")
fun setOnLayoutChangeListener(
    view: View,
    oldValue: View.OnLayoutChangeListener?,
    newValue: View.OnLayoutChangeListener?
) {
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
      if (oldValue != null) {
          view.removeOnLayoutChangeListener(oldValue)
      }
      if (newValue != null) {
          view.addOnLayoutChangeListener(newValue)
      }
  }
}
" 在这种情况下,您只需要使用一种方法创建一个接口,如下所示:

interface CustomOnCheckedListener {
    fun onChecked(isChecked: Boolean)
} 
然后,您的绑定适配器:

@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: CustomCheckListener) {
    view.setOnCheckedChangeListener(
        { _, isChecked ->
            if (view.isPressed) onCheckedChanged.onChecked(isChecked)
        }
    )
}
在ViewModel类中,您需要创建一个具有侦听器方法相同签名的函数:

fun onChecked(isChecked: Boolean){
    //some code here
}
在xml中,只需传递对函数的引用:

"@{viewModel::onChecked}"
解决方案:(KOTLIN) 将lambda参数一起使用


|val lambda:(arg1,arg2,…)->类型|
一,️⃣ ➖ Lambda实现:

MainActivity.kt

val lambda: (TextView?) -> Unit = {
    Log.i(TAG, "lambda: ${it?.text}")
}

二,️⃣ ➖ BindingAdapter实现:

绑定.kt

@BindingAdapter("lambda")
fun View.lambda(block: (TextView?) -> Unit) {
    // Your logic
}

三,️⃣ ➖ 使用数据绑定和绑定适配器:

@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Boolean) -> Unit) {
    view.setOnCheckedChangeListener(
        { _, isChecked ->
            if (view.isPressed) onCheckedChanged(isChecked)
        }
    )
}
activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">

   <data>

       <variable
           name="activityMain"
           type="com.veldan.mvi.ui.activities.MainActivity" />
   </data>

   <View
        lambda="@{activityMain.lambda}"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</layout>



PS.Velu_daN:热爱你所做的一切你尝试过吗
bind:onCheckedChanged=“@{viewModel::onCheckedChanged}”
?@Fred我尝试过->没有工作感兴趣。。。但是它在xml中看起来如何呢?@RenaudC。我添加了您需要在布局中编写的代码,因此我猜在您的界面中,函数是onChecked()且没有doIt(),对吗?@RenaudC。但是这里重要的是引用的函数必须具有与侦听器函数相同的签名,幸运的是,如果签名不匹配,编译器将显示错误。
@BindingAdapter("lambda")
fun View.lambda(block: (TextView?) -> Unit) {
    // Your logic
}
<layout xmlns:android="http://schemas.android.com/apk/res/android">

   <data>

       <variable
           name="activityMain"
           type="com.veldan.mvi.ui.activities.MainActivity" />
   </data>

   <View
        lambda="@{activityMain.lambda}"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</layout>