Proxy cho các API mới

Bài học này sẽ hướng dẫn bạn cách phân lớp con các lớp trừu tượng CompatTabTabHelper, đồ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 có hỗ trợ phương thức triển khai.

Triển khai thẻ bằng API mới

Các lớp cụ thể của CompatTabTabHelper sử dụng API mới hơn là cách 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 hơn này chỉ đơn giản là gọi phương thức proxy và kết quả của các lớp đó.

Bạn có thể trực tiếp sử dụng các API mới hơn trong các lớp cụ thể này (chứ không gặp sự cố trên các thiết bị cũ hơn) do tải từng phần. Các 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 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 tạo thực thể 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ỳ ngoại lệ VerifyError nào.

Quy ước đặt tên phù hợp cho cách triển khai này là thêm tên mã phiên bản nền tảng hoặc cấp độ API tương ứng với các API mà các lớp cụ thể yêu cầu. Ví dụ: việc triển khai thẻ gốc có thể do các lớp CompatTabHoneycombTabHelperHoneycomb cung cấp, vì các lớp này dựa vào API có trong Android 3.0 (API cấp 11) trở lên.

Sơ đồ lớp để triển khai các thẻ Honeycomb.

Hình 1. Sơ đồ lớp để triển khai các thẻ Honeycomb.

Triển khai CompatTabHoneycomb

CompatTabHoneycomb là cách triển khai lớp trừu tượng CompatTabTabHelperHoneycomb dùng để tham chiếu từng thẻ. CompatTabHoneycomb chỉ proxy tất 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 để proxy các lệnh gọi phương thức đến ActionBar thực tế, lấy từ Activity chứa trong đó.

Triển khai TabHelperHoneycomb, các lệnh 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.
}

Bạn cũng nên đọc