Sự khác biệt giữa ứng dụng: srcCompat và android: src trong bố cục XML của Android


138

Bất cứ khi nào tôi tạo ImageView với biểu tượng được thêm bằng Tài sản Vector của Android Studio, tôi sẽ gặp lỗi tại dòng app:srcCompat="@drawable/ic_play"

Khi tôi thay đổi app:srcCompatbằng android:src, lỗi sẽ biến mất nhưng biểu tượng trông như pixel.

Sự khác biệt chính giữa

app:srcCompat="@drawable/ic_play"

android:src="@drawable/ic_play"

Câu trả lời:


139

ứng dụng: srcCompat

là phương pháp dễ dàng nhất để tích hợp các bản vẽ vector vào ứng dụng của bạn. Các bản vẽ có thể cho phép bạn thay thế nhiều tài sản png bằng một đồ họa vector duy nhất, được xác định trong XML. Trong khi trước đây giới hạn ở Lollipop và các thiết bị cao hơn

Ghi chú

Kể từ Thư viện hỗ trợ Android 23.3.0 , các bản vẽ vector hỗ trợ chỉ có thể được tải qua app:srcCompat.

bạn cần thêm vectorDrawables.useSupportL Library = true vào build.gradletệp của bạn

    // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

android: src

Đặt một drawable là nội dung của ImageView.It này sẽ hiển thị ở kích thước ban đầu của nó. Không có tỷ lệ tự động.


2
lỗi với ứng dụng: srcCompact đã biến mất khi thêm vectorDrawables.useSupportL Library = true trong mô-đun ứng dụng Gradle
Zayid Mohammed

3
Ứng dụng: srcCompat có xung đột với các phiên bản Android cũ hơn không? Cụ thể hơn, Api 19 là phiên bản cũ nhất mà tôi đang đề cập đến.
Equivocal

Wow cuối cùng có thể thoát khỏi các biểu tượng bitmap.
Mèo Meow 2012

Liên kết bài đăng trên Google Plus hiện đã chết
Vadim Kotov

Tôi đã thêm ở trên build.gradle, nhưng nó vẫn không hoạt động, có ý tưởng nào không?
David Callanan

20

Nếu bạn đang sử dụng android:src="@drawable/some_vector"mà không có vectorDrawables.useSupportLibrary = truetrong tệp build.gradle và ứng dụng của bạn có hình ảnh vectơ (có thể vẽ được bằng vectơ), thì trong khi xây dựng tệp apk Trình cắm lớp Android sẽ tạo ra rất nhiều tệp * .png cho các màn hình khác nhau (hdpi, xhdpi ...) từ mỗi vector của bạn có thể vẽ được (chỉ dành cho API = <19). Kết quả - kích thước lớn hơn của apk .

Khi sử dụng app:srcCompat="@drawable/some_vector"với vectorDrawables.useSupportLibrary = trueandroid sử dụng các tệp có thể vẽ vector mà không tạo *.pngtệp.

Bạn có thể kiểm tra điều này với công cụ phân tích apk Android Studio. Chỉ cần xây dựng apk có và không có vectorDrawables.useSupportLibrary = true.

Tôi nghĩ rằng đây là sự khác biệt chính.


Vì vậy, nếu bạn đã sử dụng setSupportL Library thành true, tại sao bạn cần cú pháp đặc biệt, thay vì android: src =? Nếu bạn sử dụng android: src = với useSupportL Library được kích hoạt, bạn có tránh được sự phổ biến của PNG không?
Oscar

9

Sử dụng:

app:srcCompat="@drawable/backImage"

Thuộc tính srcCompat thực sự được xác định trong thư viện AppCompat. Quan trọng: bạn sẽ cần thêm không gian tên thích hợp cho việc này.

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

Ghi chú

Những gì bạn đang nhận được dường như chỉ là một lỗi lint có thể bỏ qua. Tôi đã thử và nhận được cùng một lỗi, nhưng nó đang hoạt động chính xác.

Bạn có thể sử dụng tools:ignore="MissingPrefix"để tránh nhìn thấy lỗi này, tạm thời.

Tôi hi vọng cái này giúp được.


5

Khi sử dụng AppCompatvới ImageView(hoặc các lớp con như ImageButtonFloatingActionButton), bạn sẽ có thể sử dụng app:srcCompatthuộc tính mới để tham chiếu các bản vẽ vector trên các phiên bản cũ hơn của nền tảng (cũng như bất kỳ bản vẽ có thể rút nào khác có sẵn android:src) .

android.support.v7.appcompat.R.attr.srcCompat :

srcCompat

Đặt một drawable là nội dung của ImageView này. Cho phép sử dụng vector drawable khi chạy trên các phiên bản cũ hơn của nền tảng.

Có thể là một tham chiếu đến tài nguyên khác, ở dạng "@[+][package:]type/name"hoặc thuộc tính chủ đề trong biểu mẫu "?[package:]type/name".


Đừng quên thêm xmlns:app="http://schemas.android.com/apk/res-auto"khi sử dụng app:srcCompat.


4

Các vectơ và vectơ hoạt hình chỉ được hỗ trợ trong các phiên bản gần đây của khung. srcCompat có thể được sử dụng với thư viện tương thích để làm cho chúng hoạt động, nhưng điều này chỉ hoạt động với các chế độ xem nhất định trong thư viện hỗ trợ. Lưu ý rằng ứng dụng: được sử dụng thay vì Android :. Điều này có nghĩa là nó không phải là một phần của khung, nhưng là một tham số được xác định bởi ứng dụng của bạn.


3
app:srcCompat="some_resource" 

được tham chiếu rằng đó là src AppCompatActivity có trong thư viện hỗ trợ trong khi

android:src="some_resource"

đề cập đến hoạt động đơn giản.


3

Khi sử dụng AppCompatvới ImageView(hoặc các lớp con như ImageButtonFloatingActionButton), bạn sẽ có thể sử dụng app:srcCompatthuộc tính mới để vẽ các vectơ tham chiếu (cũng như bất kỳ bản vẽ có thể rút nào khác có sẵn android:src). Và nếu bạn thay đổi drawable khi chạy, bạn sẽ có thể sử dụng cùng một setImageResource()phương thức như trước đây (không có thay đổi nào ở đó).

Sử dụng AppCompatapp:srcCompatlà phương pháp hoàn hảo nhất để tích hợp các bản vẽ vector vào ứng dụng của bạn. Bạn sẽ thấy rằng các bản vẽ vector tham chiếu trực tiếp bên ngoài app:srcCompatsẽ thất bại trước Lollipop .


1

Android 5.0 (API cấp 21) trở lên cung cấp hỗ trợ có thể vẽ vector để hỗ trợ các bản vẽ vector trong ứng dụng phiên bản cũ hơn: srcCompat đã được thêm vào

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.