在我的应用程序中使用数据绑定时,编译时会收到以下警告:
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>的
有没有办法逃避这些::',所以它被正确解释?
答案 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());
}
。