【问题标题】:Cannot use same BindingAdapter on two different views不能在两个不同的视图上使用相同的 BindingAdapter
【发布时间】:2020-05-17 04:44:43
【问题描述】:

我为单击Chip 上的关闭图标时编写了一个自定义BindingAdapter

@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(onCloseClicked: () -> Unit) {
    setOnCloseIconClickListener { onCloseClicked() }
}

我将它绑定在我的布局中,如下所示:

<?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>

当我只绑定 1 个芯片时(如上),一切正常。 当我还绑定第二个芯片时:

        <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()}" />

由于数据绑定错误,应用程序不再构建:

com/example/playground/databinding/ActivityMainBindingImpl.java
错误:缺少返回语句

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

【问题讨论】:

  • 您可以从您的viewmodel 添加您的chip2CloseClicked 方法吗?
  • 只是一个没有参数的void方法,和chip1CloseClicked一样。
  • 我知道,它可能包含错误。你的viewmodel是java写的吗?
  • @mahdishahbazi 不,Kotlin。 github.com/fmweigl/ChipDatabinding/blob/master/app/src/main/… 两种方法都可以从数据绑定中调用,我就是不能同时绑定。

标签: android kotlin android-databinding


【解决方案1】:

question 已经讨论过这个问题 - 数据绑定编译器生成无效的 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;
        }
    }
}

这里缺少带有return 语句的default 分支。

要解决这个问题,在您的情况下,您可以将标有@BindingAdapter 注释的函数签名更改为下一个

@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(clickListener: View.OnClickListener?) {
    setOnCloseIconClickListener(clickListener)
}

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

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我通过将 chip1CloseClicked 函数的返回类型更改为 Void? 和我的绑定适配器来解决它,如下所示:

    @BindingAdapter("onCloseClicked")
    fun Chip.onCloseClicked(onCloseClicked: () -> Void) {
        setOnCloseIconClickListener { onCloseClicked() }
    }
    

    在这种情况下,编译器可以从您的 Kotlin 代码生成正确的 Java 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2018-10-22
      • 2020-11-07
      • 1970-01-01
      相关资源
      最近更新 更多