Android 数据绑定:"Method references using '.' is deprecated"

Android Databinding: "Method references using '.' is deprecated"

在我的应用程序中使用数据绑定时,我在编译时收到以下警告:

Warning:Method references using '.' is deprecated. Instead of 'handler.onItemClick', use 'handler::onItemClick'

请看下面我的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"
    xmlns:tools="http://schemas.android.com/tools">
    <data>
        <variable name="handler" type="ClickHandler"/>
        <variable name="active" type="boolean"/>
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:onClick="@{!active ? handler.onItemClick : null}"
        android:background="@color/backgroundWhite"/>
    </RelativeLayout>
</layout>

请注意条件语句中的:

非常简单的消息,直到我更改“.”。到'::'。

android:onClick="@{!active ? handler::onItemClick : null}"

由于 onItemClick 在条件语句中,它似乎将两个 :: 中的第一个解释为条件的 'else' 语句。在第二个“:”上,我得到错误:

<expr> expected, got ':'

编辑:正如@CommonsWare 在评论中建议的那样,将语句反转为 "@{active ? null : handler::onItemClick}" 也没有帮助,显示了类似的错误(见评论)

EDIT2:显然,当剥离条件语句时,留下 "@{handler::onItemClick}",它仍然给出一个错误:'!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':' 使用点符号,仍然给出一个编译时警告

有什么方法可以转义这些 ::'s,以便正确解释吗?

我的猜测是显示弃用警告是因为 Android 数据绑定目前与 Java 8 不完全兼容。 将以下内容放入项目的 build.gradle 文件中应该会隐藏提到的警告。

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
}

除非您在项目中使用 Java 8 个功能。

您仍然可以使用 JavaVersion.VERSION_1_8。 只需使用 app:onClick,并像这样定义一个 BindingAdapter:

@BindingAdapter("onClick") 
public static void bindOnClick(View view, final Runnable runnable) {
    view.setOnClickListener(v -> runnable.run());
}

然后您可以使用 app:onClick="@{handler::onItemClick}" 而不会出现警告或错误。

我不想关闭 Java 8 所以我在数据绑定中使用了 lambda 表达式:

android:onClick="@{(v)->handler.onItemClick(v)}"

Here 是 George Mount 的一篇文章,给出了很多例子。

需要注意的一点是,lambda 表达式是在事件发生时绑定的,而不是在绑定时。

“::”错误目前是 bug Android Studio xml 编辑器的未解决问题。