Android数据绑定:“方法引用使用'。'已弃用“

时间:2016-05-19 12:46:33

标签: android xml android-studio data-binding android-databinding

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

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 ':'使用点符号,编译时仍会发出警告< / em>的

有没有办法逃避这些::',所以它被正确解释?

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

&#39; ::&#39;错误目前是Android Studio xml编辑器的开放bug

答案 2 :(得分:2)

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

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

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

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

答案 3 :(得分:1)

您仍然可以使用js.executeScript("scroll(0,document.body.scrollHeight);"); 。 只需使用JavaVersion.VERSION_1_8,并像这样定义一个BindingAdapter:

app:onClick

然后您可以在没有警告或错误的情况下使用@BindingAdapter("onClick") public static void bindOnClick(View view, final Runnable runnable) { view.setOnClickListener(v -> runnable.run()); }