我正在尝试绑定以下元素:
xml:
<android.support.v7.widget.SwitchCompat
...
bind:onCheckedChanged="@{(isChecked) -> viewModel.onCheckedChanged(isChecked)}"
.../>
viewModel:
class MyViewModel() {
fun onCheckedChanged(isChecked: Boolean) {
...
}
}
使用BindingAdapter:
@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Boolean) -> Unit) {
view.setOnCheckedChangeListener(
{ _, isChecked ->
if (view.isPressed) onCheckedChanged(isChecked)
}
)
}
我得到的错误是这个:
数据绑定错误**** msg:找不到方法 类中的onCheckedChanged(java.lang.Object) MyViewModel
数据绑定器似乎无法将isChecked
识别为Boolean
。我试图强制像isChecked:Boolean
这样的xml中键入内容,但是出现了很多不同的错误。
现在我通过使用Any
而不是Boolean
使其起作用,但是我觉得这是错误的:
@BindingAdapter("onCheckedChanged")
fun bindOnCheckedChanged(view: SwitchCompat, onCheckedChanged: (Any) -> Unit) {
...
和
fun onCheckedChanged(isChecked: Any) {
val isSwitchChecked = isChecked as? Boolean ?: return
...
有人知道如何使它正确的功能签名吗?
答案 0 :(得分:2)
根据Binding Adapters documentation:“事件处理程序只能与具有一种抽象方法的接口或抽象类一起使用,如以下示例所示:
@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)
}
}
}
” DB docs never specify you can use Kotlin lambdas in Binding Adapters 在这种情况下,您只需要使用以下一种方法创建接口:
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}"
答案 1 :(得分:0)
使用带有参数
的lambda1️⃣ ➖ Lambda 实现:
MainActivity.kt
val lambda: (TextView?) -> Unit = {
Log.i(TAG, "lambda: ${it?.text}")
}
2️⃣ ➖ BindingAdapter 实现:
绑定.kt
@BindingAdapter("lambda")
fun View.lambda(block: (TextView?) -> Unit) {
// Your logic
}
3️⃣ ➖ 使用 DataBinding 和 BindingAdapter:
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>
附注。 Vel_daN:爱你所做的?。