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 编辑器的未解决问题。
在我的应用程序中使用数据绑定时,我在编译时收到以下警告:
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 编辑器的未解决问题。