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 ':'
Используя точечную нотацию, все равно выдает предупреждение при компиляции
Есть ли способ избежать этих::, так что это правильно интерпретируется?
Ответы
Ответ 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)}"
Здесь - статья Джорджа Гора, в которой представлено множество примеров.
Следует отметить, что выражение лямбда связано, когда событие происходит не во время привязки.