Android

Sử dụng Android VectorDrawableCompat

Trong bài trước thì chúng ta đã tìm hiểu về VectorDrawable với những điểm mạnh và điểm yếu của nó. Tuy nhiên có một điểm yếu là nó chỉ khả dụng trên Android 5.0 Lollipop với mức API là 21 về sau. Để mang nó lên các mức API thấp hơn thì chúng ta, như bình thường, là dùng thư viện Support của nó.

VectorAssetPicker

1. Thêm thư viện vào ứng dụng

Để thêm thư viện vector drawable support vào ứng dụng, ngoài việc yêu cầu compile hay implementation bộ thư viện với maven, bạn cũng cần làm một bước khác. Vì vậy, để cho tiện lợi, tôi sẽ đưa ra tập tin build.gradle:app và bạn chỉ cần làm theo:

2. Sử dụng VectorDrawableCompat

Việc tạo vector drawable tôi đã trình bày trong bài trước. Bình thường thì bạn sẽ gán drawable vào cho ImageView trong attr android:src, chẳng hạn:

Tuy nhiên, khi sử dụng thư viện Support của vector drawable, bạn sẽ gán drawable qua attr app:srcCompat. Ngay cả trên API21+ thì bạn vẫn phải sử dụng attr vừa rồi.

Còn trong Activity, một yêu cầu là các class Activity của bạn sẽ phải extends AppCompatActivity hoặc sub class của nó. Thông thường, điều này đã là mặc định đối với Android Studio. Thông tin thêm là VectorDrawableCompat cần có các AppCompatDelegate “chạy tiên phong”. AppCompatActivity theo tạo hóa đã gọi sẵn các AppCompatDelegate nên bạn chỉ cần extends nó là đủ. Tuy nhiên, trong Java, nếu bạn có ImageView#setImageResource(int drawable) tương ứng với android:src của XML thì bạn không có method tương ứng cho app:srcCompat kể cả đó là AppCompatImageView. Do đó, bạn cần “thuê” một method sau trước khi gọi ImageView#setImageResource(int), và chỉ cần gọi một lần duy nhất trong mỗi Activity, vì vậy tốt nhất bạn nên để ngay dưới AppCompatActivity.super.onCreate(Bundle) là hay nhất. Chẳng hạn:

Nếu bạn không gọi AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) thì một Exception sẽ được thảy ra nếu bạn setImageResource cho (AppCompat)ImageView hoặc compound drawable cho TextView do những method này theo mặc định là chưa bị ảnh hưởng bởi AppCompatDelegate. Còn đối với ActionBar optionsMenu thì bạn cứ thao tác như bình thường vì theo mặc định thì nó đã chịu ảnh hưởng của AppCompatDelegate. Dù cung cấp thông tin cho bạn là như vậy, bạn có thể không cần nhớ rõ lí do cho chật não, cứ gọi static method trên là đủ rồi.

3. Thông tin thêm VectorDrawableCompat

Trong trường hợp bạn viết ứng dụng có minSdk là 21 thì bạn vẫn nên sử dụng thư viện Support này, vì đúng ra nó chính là thư viện Framework của API mức cao hơn (đúng ra là 23) xuống API 21 và 22 cũng như có vài bug fixes cho API 23. Chẳng hạn, bạn có thể truyền tham số màu dưới dạng @ColorRes vào attr android:color cho một vector drawable như:

Tuy nhiên, nếu minSdk là 24 tức Android 7.0 Nougat, thì bạn không cần và cũng không nên dùng thư viện này vì VectorDrawable của thư viện Framework sẽ được gọi tới. Vì vậy việc sử dụng thư viện Support sẽ chỉ làm nặng tập tin APK mà thôi, hoàn toàn không có tác dụng gì.

4. Các trường hợp VectorDrawableCompat không có ảnh hưởng:

Cũng như các thư viện support khác, vector drawable support chỉ có thể được sử dụng trong môi trường package của bạn, tức là khi app chạy, hay nói đúng hơn là khi có giao diện của ứng dụng của bạn được gọi, chẳng hạn Activity hoặc Service có window, và quan trọng hơn hết là có sự can thiệp của AppCompatDelegate. Đối với các trường hợp ngoài môi trường ứng dụng, chẳng hạn là homescreen widget, thì chúng sẽ không hoạt động kể cả đó là Android 6.0 đi nữa. Vì vậy, trong trường hợp cụ thể đó, bạn phải sử dụng ảnh PNG hoặc dùng vector drawable của framework nếu là API21 về sau. Và tới đây, tôi hi vọng bạn đã có đủ các kiến thức cơ bản về vector drawable để sử dụng linh hoạt trong ứng dụng Android của mình. Chúc các bạn thành công.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.