Подтвердить что ты не робот

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>

Обратите внимание на : из условного оператора

Довольно простое сообщение, пока я не изменю '.' to '::'.

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

Так как onItemClick находится внутри условного оператора, он, кажется, интерпретирует первое из двух:: как условие else. На втором ":" я получаю сообщение об ошибке:

<expr> expected, got ':'

EDIT: как @CommonsWare, предлагаемая в комментариях, инвертирует утверждение   "@{active ? null : handler::onItemClick}" не помогает, аналогичная ошибка показана (см. комментарии)

EDIT2: По-видимому, при удалении условного оператора, оставаясь с "@{handler::onItemClick}", он все равно дает ошибку: '!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':' Используя точечную нотацию, все равно выдает предупреждение при компиляции

Есть ли способ избежать этих::, так что это правильно интерпретируется?

4b9b3361

Ответ 1

Я предполагаю, что предупреждение об устаревании показано, потому что привязка данных Android в настоящее время не полностью совместима с Java 8. Включение в файл проекта build.gradle следующего содержания должно скрывать указанное предупреждение.

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

Если вы не используете функции Java 8 в своем проекте.

Ответ 2

Ошибка '::' в настоящее время является открытой ошибкой для XML-редактора Android Studio.

Ответ 3

Вы можете использовать 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}" без предупреждений или ошибок.

Ответ 4

Я не хотел отключать Java 8, поэтому вместо этого я использовал лямбда-выражения в привязке данных:

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

Здесь - статья Джорджа Гора, в которой представлено множество примеров.

Следует отметить, что выражение лямбда связано, когда событие происходит не во время привязки.