Bài học này hướng dẫn bạn cách tạo lớp con cho các lớp trừu tượng CompatTab và TabHelper, đồng thời sử dụng các API mới. Ứng dụng của bạn có thể sử dụng phương thức triển khai này trên các thiết bị chạy phiên bản nền tảng hỗ trợ phương thức này.
Triển khai các thẻ bằng API mới
Các lớp cụ thể cho CompatTab và TabHelper sử dụng các API mới hơn là một quy trình triển khai proxy. Vì các lớp trừu tượng được xác định trong bài học trước phản ánh các API mới (cấu trúc lớp, chữ ký phương thức, v.v.), nên các lớp cụ thể sử dụng các lệnh gọi phương thức proxy API mới hơn này và kết quả của chúng.
Bạn có thể trực tiếp sử dụng các API mới hơn trong những lớp cụ thể này (và không gặp sự cố trên các thiết bị cũ hơn) nhờ tính năng tải lớp trì hoãn. Các lớp được tải và khởi tạo khi truy cập lần đầu – khởi tạo lớp hoặc truy cập vào một trong các trường hoặc phương thức tĩnh của lớp đó lần đầu tiên. Do đó, miễn là bạn không khởi tạo các triển khai dành riêng cho Honeycomb trên các thiết bị trước Honeycomb, VM Dalvik sẽ không đưa ra bất kỳ ngoại lệ VerifyError nào.
Quy ước đặt tên phù hợp cho quá trình triển khai này là thêm cấp độ API hoặc tên mã phiên bản nền tảng tương ứng với các API mà các lớp cụ thể yêu cầu. Ví dụ: bạn có thể triển khai thẻ gốc bằng các lớp CompatTabHoneycomb và TabHelperHoneycomb, vì các lớp này dựa vào các API có trong Android 3.0 (cấp độ API 11) trở lên.
Triển khai CompatTabHoneycomb
CompatTabHoneycomb là cách triển khai lớp trừu tượng CompatTab mà TabHelperHoneycomb dùng để tham chiếu đến từng thẻ. CompatTabHoneycomb uỷ quyền tất cả các lệnh gọi phương thức cho đối tượng ActionBar.Tab mà nó chứa.
Bắt đầu triển khai CompatTabHoneycomb bằng các API ActionBar.Tab mới:
Kotlin
class CompatTabHoneycomb internal constructor(val activity: Activity, tag: String) : CompatTab(tag) { ... // The native tab object that this CompatTab acts as a proxy for. private var mTab: ActionBar.Tab = // Proxy to new ActionBar.newTab API activity.actionBar.newTab() override fun setText(@StringRes textId: Int): CompatTab { // Proxy to new ActionBar.Tab.setText API mTab.setText(textId) return this } ... // Do the same for other properties (icon, callback, etc.) }
Java
public class CompatTabHoneycomb extends CompatTab { // The native tab object that this CompatTab acts as a proxy for. ActionBar.Tab mTab; ... protected CompatTabHoneycomb(FragmentActivity activity, String tag) { ... // Proxy to new ActionBar.newTab API mTab = activity.getActionBar().newTab(); } public CompatTab setText(int resId) { // Proxy to new ActionBar.Tab.setText API mTab.setText(resId); return this; } ... // Do the same for other properties (icon, callback, etc.) }
Triển khai TabHelperHoneycomb
TabHelperHoneycomb là quá trình triển khai lớp trừu tượng TabHelper, trong đó các lệnh gọi phương thức được uỷ quyền cho một ActionBar thực tế, nhận được từ Activity có trong đó.
Triển khai TabHelperHoneycomb, uỷ quyền các lệnh gọi phương thức đến API ActionBar:
Kotlin
class TabHelperHoneycomb internal constructor(activity: FragmentActivity) : TabHelper(activity) { private var mActionBar: ActionBar? = null override fun setUp() { mActionBar = mActionBar ?: mActivity.actionBar.apply { navigationMode = ActionBar.NAVIGATION_MODE_TABS } } override fun addTab(tab: CompatTab) { // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. mActionBar?.addTab(tab.getTab() as ActionBar.Tab) } }
Java
public class TabHelperHoneycomb extends TabHelper { ActionBar actionBar; ... protected void setUp() { if (actionBar == null) { actionBar = activity.getActionBar(); actionBar.setNavigationMode( ActionBar.NAVIGATION_MODE_TABS); } } public void addTab(CompatTab tab) { ... // Tab is a CompatTabHoneycomb instance, so its // native tab object is an ActionBar.Tab. actionBar.addTab((ActionBar.Tab) tab.getTab()); } // The other important method, newTab() is part of // the base implementation. }