gpt4 book ai didi

android - 不能在两个不同的 View 上使用相同的 BindingAdapter

转载 作者:行者123 更新时间:2023-12-02 12:16:00 26 4
gpt4 key购买 nike

我写了一个自定义BindingAdapterChip 上的关闭图标时被点击:

@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(onCloseClicked: () -> Unit) {
setOnCloseIconClickListener { onCloseClicked() }
}
我将它绑定(bind)在我的布局中,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<layout>

<data>

<variable
name="viewModel"
type="com.example.playground.MyViewModel" />

</data>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="chip 1"
app:closeIconEnabled="true"
app:onCloseClicked="@{() -> viewModel.chip1CloseClicked()}" />

<com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="chip 2"
app:closeIconEnabled="true" />

</LinearLayout>
</layout>
当我只绑定(bind) 1 个芯片(如上)时,一切正常。
当我还绑定(bind)第二个芯片时:
        <com.google.android.material.chip.Chip
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="chip 2"
app:closeIconEnabled="true"
app:onCloseClicked="@{() -> viewModel.chip2CloseClicked()}" />
由于数据绑定(bind)错误,该应用程序不再构建:

com/example/playground/databinding/ActivityMainBindingImpl.java
error: missing return statement


关于为什么会发生这种情况以及如何解决它的任何想法?

最佳答案

那个问题已经在 question 中讨论过了。 - 数据绑定(bind)编译器生成无效的 java 代码:

// Listener Stub Implementations
// callback impls
public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
switch(sourceId) {
case 1: {
// localize variables for thread safety
// viewModel
com.example.playground.MyViewModel viewModel = mViewModel;
// viewModel != null
boolean viewModelJavaLangObjectNull = false;



viewModelJavaLangObjectNull = (viewModel) != (null);
if (viewModelJavaLangObjectNull) {


viewModel.chip1CloseClicked();
}
return null;
}
case 2: {
// localize variables for thread safety
// viewModel
com.example.playground.MyViewModel viewModel = mViewModel;
// viewModel != null
boolean viewModelJavaLangObjectNull = false;



viewModelJavaLangObjectNull = (viewModel) != (null);
if (viewModelJavaLangObjectNull) {


viewModel.chip2CloseClicked();
}
return null;
}
}
}

这里 defaultreturn 的分支声明丢失。

要解决它,在您的情况下,您可以更改函数签名,标记为 @BindingAdapter注释,到下一个
@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(clickListener: View.OnClickListener?) {
setOnCloseIconClickListener(clickListener)
}

应用更改后,项目将成功编译。

关于android - 不能在两个不同的 View 上使用相同的 BindingAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60005152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com