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
, cũng như cách 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ợ các tính năng đó.
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 phương thức triển khai proxy. Vì các lớp trừu tượng được định nghĩa 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 API mới này chỉ gọi phương thức proxy và kết quả của chúng.
Bạn có thể trực tiếp sử dụng các API mới trong các lớp cụ thể này và không gặp sự cố trên các thiết bị cũ do tải từng phần. Lớp được tải và khởi tạo trong lần truy cập đầu tiên – tạo thực thể cho lớp đó hoặc truy cập vào một trong các trường hay phương thức tĩnh của lớp đó lần đầu tiên. Do đó, miễn là bạn không tạo thực thể cho các hoạt động triển khai dành riêng cho Honeycomb trên các thiết bị trước Honeycomb, máy ảo Dalvik sẽ không gửi bất kỳ trường hợp ngoại lệ VerifyError
nào.
Một quy ước đặt tên hiệu quả cho hoạt động triển khai này là thêm tên mã phiên bản cấp độ API hoặc phiên bản nền tảng tương ứng với API mà lớp cụ thể yêu cầu. Ví dụ: các lớp CompatTabHoneycomb
và TabHelperHoneycomb
có thể cung cấp tính năng triển khai thẻ gốc, vì các lớp này dựa vào các API có trong Android 3.0 (API cấp 11) trở lên.
Triển khai CompatTabHoneycomb
CompatTabHoneycomb
là cách triển khai lớp trừu tượng CompatTab
mà TabHelperHoneycomb
sử dụng để tham chiếu đến từng thẻ. CompatTabHoneycomb
chỉ cần làm proxy cho tất cả các lệnh gọi phương thức đến đối tượng ActionBar.Tab
chứa trong đó.
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à cách triển khai lớp trừu tượng TabHelper
, lớp này sẽ chuyển tiếp các lệnh gọi phương thức đến một ActionBar
thực tế, được lấy từ Activity
có trong lớp đó.
Triển khai TabHelperHoneycomb
, gọi phương thức proxy đế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. }