2016-05-19 23 views
13

Khi sử dụng liên kết dữ liệu trong ứng dụng của tôi, tôi nhận được cảnh báo sau khi biên dịch:Android Databinding: "Phương pháp tham chiếu sử dụng '.' bị phản đối"

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

Xin xem XML của tôi dưới đây.

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

Xin lưu ý : từ tuyên bố có điều kiện nhắn

Khá đơn giản, cho đến khi tôi thay đổi '' đến '::'.

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

Kể từ khi onItemClick là bên trong một tuyên bố có điều kiện, có vẻ như để giải thích đầu tiên của hai :: 's là '' tuyên bố khác của tình trạng này. Ngày thứ hai ':', tôi nhận được lỗi:

<expr> expected, got ':'

EDIT: Như @CommonsWare gợi ý trong các ý kiến, đảo ngược tuyên bố để "@{active ? null : handler::onItemClick}" không giúp được gì, một lỗi tương tự được hiển thị (xem ý kiến)

EDIT2: Rõ ràng, khi tước tuyên bố có điều kiện đi, bị bỏ lại với "@{handler::onItemClick}", nó vẫn mang lại một lỗi: '!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':' Sử dụng dot-ký hiệu, vẫn đưa ra một cảnh báo khi biên soạn

Có cách nào để thoát khỏi các :: của, vì vậy nó được giải thích một cách chính xác?

+2

Trong trường hợp này, bạn có thể thử đổi thứ tự như một giải pháp thay thế: '@ {active? null: handler :: onItemClick} '. Nếu không, điều này giống như một lỗi trong hỗ trợ ràng buộc dữ liệu. – CommonsWare

+1

@CommonsWare: Thật không may, điều đó cũng đưa ra một lỗi, vào ngày đầu tiên của hai :: 's thời gian này: ''! = ','% ',' * ',' + ',', ',' - ','. ','/', <, <<, <=, '==', '>', '> =', '>>', '>>>' hoặc '[' dự kiến, có ':' ' – Marcel50506

+0

Phooey. Nếu bạn có thể tạo dự án mẫu thể hiện lỗi, bạn có thể [đăng báo cáo lỗi] (https://code.google.com/p/android/issues/list). Tôi không thấy một cái ở đó vì điều này. Cuối cùng tôi sẽ cố gắng tái tạo bản thân này, nếu bạn không có cơ hội để gửi một vấn đề. – CommonsWare

Trả lời

5

Tôi đoán là cảnh báo không dùng nữa được hiển thị vì Android Data Binding hiện không hoàn toàn tương thích với Java 8. Đặt những điều sau vào tệp build.gradle của dự án của bạn nên ẩn cảnh báo được đề cập.

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

Trừ khi bạn đang sử dụng các tính năng Java 8 trong dự án của mình.

1

Bạn vẫn có thể sử dụng JavaVersion.VERSION_1_8. Chỉ cần sử dụng app:onClick, và xác định một BindingAdapter như thế này:

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

Sau đó, bạn có thể sử dụng app:onClick="@{handler::onItemClick}" mà không cảnh báo hoặc lỗi.

1

Tôi không muốn để tắt Java 8 vì vậy tôi sử dụng các biểu thức lambda trong databinding thay vì:

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

Here là một bài viết của George Núi cung cấp cho rất nhiều ví dụ.

Một điều cần lưu ý là biểu thức lambda bị ràng buộc khi sự kiện xảy ra không theo thời gian ràng buộc.

3

Lỗi '::' hiện đang mở bug cho trình chỉnh sửa xml Android Studio.

Các vấn đề liên quan