2016-03-03 20 views
25

Tôi đang sử dụng hỗ trợ vẽ vector mới trong Hỗ trợ Lib v23.2 với ứng dụng: srcCompat & cố gắng đặt tính năng drawable thông qua ràng buộc dữ liệu.Kết nối dữ liệu với srcCompat

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

<data> 
    <variable 
     name="mediaPojo" 
     type="in.ishaan.pika.data_binding.MediaPojo"/> 
</data> 

<RelativeLayout 
    android:background="@color/black" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <VideoView 
     ... /> 

    <ImageView 
     ... 
     app:srcCompat="@{mediaPojo.isPlaying ? @drawable/ic_pause_24dp : @drawable/ic_play_arrow_24dp}" 
    /> 

    <ProgressBar 
     .../> 
</RelativeLayout> 
</layout> 

Mở cố gắng xây dựng, studio ném:

Error:(33, 30) Cannot find the setter for attribute 'app:srcCompat' with parameter type android.graphics.drawable.Drawable.

+0

Bạn có bao gồm thuộc tính 'xmlns: app =" http://schemas.android.com/apk/res-auto "' trên phần tử gốc của bố cục không? –

+0

@PaulDS yep, hãy để tôi cập nhật câu hỏi với bố cục đầy đủ –

Trả lời

34

Bạn chỉ cần sử dụng android: src thuộc tính thay vì thuộc tính compat khi bạn đặt tài nguyên vectơ bằng DataBinding.

Thư viện DataBinding tạo lớp thực thi phương thức setImageResource khi chạy.

<ImageView 
     ... 
     android:src="@{@drawable/your_drawable}" 
/> 

Theo http://android-developers.blogspot.com/2016/02/android-support-library-232.htmlsetImageResource phương pháp có thể được sử dụng khi chạy trên các phiên bản hệ thống cũ mà không cần bất kỳ thay đổi bổ sung.

Nếu bạn muốn sử dụng ứng dụng: srcCompat thuộc tính. Bạn phải định nghĩa chú thích @BindingMethods để kết nối thuộc tính với setter thích hợp từ ImageView. Ví dụ: trong Hoạt động hoặc Phân đoạn của bạn thêm.

@BindingMethods({ 
    @BindingMethod(type = android.widget.ImageView.class, 
      attribute = "app:srcCompat", 
      method = "setImageDrawable") }) 
public class MainActivity extends AppCompatActivity { 
    // your activity body here 

} 
+0

_ "Thư viện DataBinding tạo lớp thực thi phương thức setImageResource khi chạy." _ Bạn có chắc chắn về điều này không? Bạn không thể mở các lớp học ràng buộc để làm thế nào để chúng tôi chắc chắn? –

+1

Tôi đã kiểm tra hai điều: 1. Hiển thị véc-tơ có thể vẽ trên thiết bị lolipop trước khi sử dụng thuộc tính android: src và DataBinding (Nó hiển thị không có ngoại lệ) 2. Một trong những phần mềm làm việc trong Google nói tại đây (trong Expression Tree (8) : 01) phần) https://realm.io/news/data-binding-android-boyar-mount/ về khớp thuộc tính src với phương thức setImageResource – lukjar

+0

Hơn nữa, bạn có thể thử tìm trong ImageViewBindingAdapter mã của mình. Nó là bộ chuyển đổi từ thư viện DataBinding được sử dụng để ràng buộc ImageView. Trong mã được tạo, bạn có thể tìm thấy các tham chiếu đến bộ điều hợp này. Bạn có thể mở các lớp được tạo bằng cách sử dụng NotePad ++ chẳng hạn :) Vì Android Studio mở bố cục xml theo mặc định. Chúng được lưu trữ trong app \ build \ intermediates \ classes \ your \ package \ name \ databinding – lukjar

0

Những câu trả lời đề xuất chủ yếu làm việc cho tôi nhưng tôi cũng cần phải thêm dòng này trong ứng dụng của tôi:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 

Làm như vậy cho phép tôi sử dụng drawables vector trong các phiên bản cũ hơn mà không cần phải lo lắng về compat các lớp hoặc thuộc tính

+0

Hãy nhớ rằng việc sử dụng cờ này gây ra các vấn đề về bộ nhớ (https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88) –

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