Giả sử bạn muốn sử dụng thẻ trên thanh thao tác làm dạng điều hướng cấp cao nhất trong ứng dụng của mình. Rất tiếc, các API ActionBar chỉ có trong Android 3.0 trở lên (cấp độ API 11 trở lên). Do đó, nếu muốn phân phối ứng dụng cho các thiết bị chạy phiên bản cũ hơn của nền tảng, bạn cần cung cấp một phương thức triển khai hỗ trợ API mới hơn trong khi cung cấp một cơ chế dự phòng sử dụng API cũ hơn.
Trong lớp học này, bạn sẽ tạo một thành phần giao diện người dùng (UI) theo thẻ sử dụng các lớp trừu tượng với các triển khai dành riêng cho phiên bản để cung cấp khả năng tương thích ngược. Bài học này mô tả cách tạo một lớp trừu tượng cho các API thẻ mới làm bước đầu tiên để tạo thành phần thẻ.
Chuẩn bị cho quá trình trừu tượng hoá
Trừu tượng hoá trong ngôn ngữ lập trình Java liên quan đến việc tạo một hoặc nhiều giao diện hoặc lớp trừu tượng để ẩn các chi tiết triển khai. Trong trường hợp các API Android mới hơn, bạn có thể sử dụng phương pháp trừu tượng hoá để tạo các thành phần nhận biết phiên bản. Các thành phần này sẽ sử dụng API hiện tại trên các thiết bị mới hơn và dự phòng cho các API cũ hơn, tương thích hơn trên các thiết bị cũ hơn.
Khi sử dụng phương pháp này, trước tiên, bạn phải xác định những lớp mới hơn mà bạn muốn có thể sử dụng theo cách tương thích ngược, sau đó tạo các lớp trừu tượng dựa trên các giao diện công khai của các lớp mới hơn. Khi xác định các giao diện trừu tượng, bạn nên phản ánh API mới nhất nhiều nhất có thể. Điều này tối đa hoá khả năng tương thích trong tương lai và giúp bạn dễ dàng loại bỏ lớp trừu tượng trong tương lai khi không còn cần thiết.
Sau khi tạo các lớp trừu tượng cho những API mới này, bạn có thể tạo và chọn bất kỳ số lượng triển khai nào trong thời gian chạy. Để tương thích ngược, các hoạt động triển khai này có thể khác nhau tuỳ theo cấp độ API bắt buộc. Do đó, một quy trình triển khai có thể sử dụng các API mới phát hành, trong khi các quy trình khác có thể sử dụng các API cũ hơn.
Tạo giao diện thẻ trừu tượng
Để tạo một phiên bản thẻ tương thích ngược, trước tiên, bạn nên xác định những tính năng và API cụ thể mà ứng dụng của bạn yêu cầu. Trong trường hợp các thẻ phần cấp cao nhất, giả sử bạn có các yêu cầu chức năng sau:
- Các chỉ báo thẻ phải hiển thị văn bản và biểu tượng.
- Các thẻ có thể được liên kết với một thực thể của mảnh.
- Hoạt động này phải có khả năng theo dõi các thay đổi về thẻ.
Việc chuẩn bị trước các yêu cầu này giúp bạn kiểm soát phạm vi của lớp trừu tượng. Điều này có nghĩa là bạn có thể dành ít thời gian hơn để tạo nhiều cách triển khai lớp trừu tượng và bắt đầu sử dụng cách triển khai mới tương thích ngược sớm hơn.
Các API chính cho thẻ nằm trong ActionBar và ActionBar.Tab. Đây là những API cần trừu tượng hoá để các thẻ của bạn nhận biết được phiên bản. Các yêu cầu đối với dự án mẫu này đòi hỏi khả năng tương thích ngược với Eclair (cấp độ API 5) trong khi tận dụng các tính năng thẻ mới trong Honeycomb (cấp độ API 11). Sau đây là sơ đồ cấu trúc lớp để hỗ trợ 2 cách triển khai này và các lớp cơ sở trừu tượng (hoặc giao diện) của chúng.
ActionBar.Tab trừu tượng
Bắt đầu xây dựng lớp trừu tượng của thẻ bằng cách tạo một lớp trừu tượng đại diện cho thẻ, phản ánh giao diện ActionBar.Tab:
Kotlin
sealed class CompatTab(val tag: String) { ... abstract fun getText(): CharSequence abstract fun getIcon(): Drawable abstract fun getCallback(): CompatTabListener abstract fun getFragment(): Fragment abstract fun setText(text: String): CompatTab abstract fun setIcon(icon: Drawable): CompatTab abstract fun setCallback(callback: CompatTabListener): CompatTab abstract fun setFragment(fragment: Fragment): CompatTab ... }
Java
public abstract class CompatTab { ... public abstract CompatTab setText(int resId); public abstract CompatTab setIcon(int resId); public abstract CompatTab setTabListener( CompatTabListener callback); public abstract CompatTab setFragment(Fragment fragment); public abstract CharSequence getText(); public abstract Drawable getIcon(); public abstract CompatTabListener getCallback(); public abstract Fragment getFragment(); ... }
Bạn có thể sử dụng một lớp trừu tượng thay vì một giao diện ở đây để đơn giản hoá việc triển khai các tính năng phổ biến, chẳng hạn như mối liên kết giữa các đối tượng thẻ với các hoạt động (không xuất hiện trong đoạn mã).
Các phương thức thẻ ActionBar trừu tượng
Tiếp theo, hãy xác định một lớp trừu tượng cho phép bạn tạo và thêm các thẻ vào một hoạt động, chẳng hạn như ActionBar.newTab() và ActionBar.addTab():
Kotlin
sealed class TabHelper(protected val activity: FragmentActivity) { ... abstract fun setUp() fun newTab(tag: String): CompatTab { // This method is implemented in a later lesson. } abstract fun addTab(tab: CompatTab) ... }
Java
public abstract class TabHelper { ... public CompatTab newTab(String tag) { // This method is implemented in a later lesson. } public abstract void addTab(CompatTab tab); ... }
Trong các bài học tiếp theo, bạn sẽ tạo các phương thức triển khai cho TabHelper và CompatTab hoạt động trên cả phiên bản nền tảng cũ và mới.