Android Databinding: “Method references using '

2020-07-02 11:13发布

When using databinding in my app, I get the following warning when compiling:

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

Please see my XML below.

<?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>

Please note the : from the conditional statement

Pretty straightforward message, until I change the '.' to '::'.

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

Since the onItemClick is inside a conditional statement, it seems to interpret the first of the two ::'s as the 'else' statement of the condition. On the second ':', I get the error:

<expr> expected, got ':'

EDIT: As @CommonsWare suggested in the comments, inverting the statement to "@{active ? null : handler::onItemClick}" doesn't help either, a similar error is shown (see comments)

EDIT2: Apparently, when stripping the conditional statement away, being left with "@{handler::onItemClick}", it still gives an error: '!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':' Using the dot-notation, still gives a warning when compiling

Is there any way to escape these ::'s, so it is interpreted correctly?

4条回答
我欲成王,谁敢阻挡
2楼-- · 2020-07-02 11:53

My guess is that the deprecation warning is shown because Android Data Binding is currently not being fully compatible with Java 8. Putting the following into your project's build.gradle file should hide mentioned warning.

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

Unless you are using Java 8 features in your project.

查看更多
Anthone
3楼-- · 2020-07-02 12:05

I didn't want to switch off Java 8 so I used the lambda expressions in databinding instead:

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

Here is an article by George Mount that gives lots of examples.

One thing to note is that the lambda expression is bound when the event occurs not at binding time.

查看更多
爱情/是我丢掉的垃圾
4楼-- · 2020-07-02 12:08

The '::' error is currently an open bug for the Android Studio xml editor.

查看更多
放荡不羁爱自由
5楼-- · 2020-07-02 12:08

You can still use JavaVersion.VERSION_1_8. Just use app:onClick, and define a BindingAdapter like this:

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

Then you can use app:onClick="@{handler::onItemClick}" without warnings or errors.

查看更多
登录 后发表回答