Android 安卓数据绑定:“;使用';的方法引用';“已弃用”;

Android 安卓数据绑定:“;使用';的方法引用';“已弃用”;,android,xml,android-studio,data-binding,android-databinding,Android,Xml,Android Studio,Data Binding,Android Databinding,在我的应用程序中使用数据绑定时,我在编译时收到以下警告: 警告:不推荐使用“.”的方法引用。不要使用“handler.onItemClick”,而是使用“handler::onItemClick” 请看下面我的XML <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://sche

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

警告:不推荐使用“.”的方法引用。不要使用“handler.onItemClick”,而是使用“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>
由于onItemClick位于条件语句中,它似乎将两个::中的第一个解释为条件的“else”语句。在第二个“:”中,我得到了错误:

应为,得到“:”

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


EDIT2:显然,当剥离条件语句时,如果留下“@{handler::onItemClick}”,它仍然会给出一个错误:
“!=”、“%”、“*”、“+”、“、”、“-”、“/” 我猜显示弃用警告是因为Android数据绑定目前与Java8不完全兼容。
将以下内容放入项目的
build.gradle
文件应该会隐藏提到的警告

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

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

您仍然可以使用
JavaVersion.VERSION\u 1\u 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)}”

是乔治·蒙特的一篇文章,给出了很多例子


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

当前Android Studio xml编辑器中存在“::”错误。

在这种情况下,您可以尝试反转顺序作为解决方法:
@{active?null:handler::onItemClick}
。否则,这感觉像是数据绑定支持中的一个bug。@Commonware:不幸的是,这也会在两个选项中的第一个出现错误::“这一次:
!=”、“%”、“*”、“+”、“、”、“-”、“/”,菲伊。如果您可以创建一个示例项目来演示错误,那么您可能会。我看不出有这样的人。如果你没有机会提交问题,我最终会尝试自己复制这个。我的是完美地处理这个
android:onClick=“@{active?null:handler.onClicked}”
并且没有警告,我猜问题可能是处理程序的类引用。不知何故,删除整个条件,或者添加括号也没用。当使用“.”时,它告诉我使用“::”,当使用“::”时,它说它期望其他东西。2岁以上:)
@BindingAdapter("onClick") 
public static void bindOnClick(View view, final Runnable runnable) {
    view.setOnClickListener(v -> runnable.run());
}