Tóm tắt các API mới

Giả sử bạn muốn sử dụng các thẻ thanh thao tác làm hình thức chính của điều hướng cấp cao nhất trong ứng dụng của mình. Rất tiếc, API ActionBar chỉ có trong Android 3.0 trở lên (API cấp 11 trở lên). Do đó, nếu muốn phân phối ứng dụng cho thiết bị chạy các phiên bản nền tảng cũ hơn, bạn cần cung cấp một quy trình triển khai hỗ trợ API mới hơn trong khi cung cấp cơ chế dự phòng sử dụng API cũ.

Trong lớp này, bạn sẽ xây dựng một thành phần giao diện người dùng (UI) dạng thẻ sử dụng các lớp trừu tượng với cách triển khai dành riêng cho từng phiên bản để đảm bảo khả năng tương thích ngược. Bài học này mô tả cách tạo lớp trừu tượng cho các API thẻ mới. Đây là bước đầu tiên để xây dựng thành phần thẻ.

Chuẩn bị cho bản tóm tắt

Mô-đun trừu tượng trong ngôn ngữ lập trình Java bao gồm việc tạo một hoặc nhiều giao diện hay lớp trừu tượng để ẩn thông tin triển khai. Trong trường hợp các API Android mới hơn, bạn có thể sử dụng tính năng trừu tượng để tạo các thành phần nhận biết phiên bản có sử dụng API hiện tại trên các thiết bị mới, đồng thời dự phòng các API cũ và tương thích hơn trên các thiết bị cũ.

Khi sử dụng phương pháp này, trước tiên bạn cần 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 giao diện công khai của các lớp mới hơn. Khi xác định giao diện trừu tượng, bạn nên phản chiếu API mới nhất có thể. Điều này tối đa hoá khả năng tương thích chuyển tiếp và giúp bạn dễ dàng bỏ lớp trừu tượng (abstraction layer) sau này khi không cần thiết nữa.

Sau khi tạo các lớp trừu tượng cho các API mới này, bạn có thể tạo và chọn số lượng phương thức triển khai bất kỳ trong thời gian chạy. Để đảm bảo khả năng tương thích ngược, những cách triển khai này có thể khác nhau theo cấp độ API cần thiết. Do đó, một phương thức triển khai có thể sử dụng các API được phát hành gần đây, trong khi một phương thức triển khai khác có thể sử dụng các API cũ.

Tạo giao diện thẻ trừu tượng

Để tạo một phiên bản thẻ có khả năng tương thích ngược, trước tiên, bạn cầ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 thẻ mục cấp cao nhất, giả sử bạn có các yêu cầu về chức năng sau đây:

  1. Chỉ báo tab phải hiển thị văn bản và một biểu tượng.
  2. Thẻ có thể được liên kết với một thực thể của mảnh.
  3. Hoạt động phải có thể theo dõi các thay đổi đối với thẻ.

Việc chuẩn bị trước những 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ể giảm bớt thời gian tạo nhiều phương thức triển khai lớp trừu tượng và bắt đầu sử dụng phương thức triển khai mới có khả năng tương thích ngược sớm hơn.

Các API chính cho thẻ nằm trong ActionBarActionBar.Tab. Đây là các API cần tóm tắt để giúp thẻ của bạn nhận biết được phiên bản. Các yêu cầu cho dự án mẫu này gọi khả năng tương thích quay lại với Eclair (API cấp 5) trong khi tận dụng các tính năng của thẻ mới trong Honeycomb (API cấp 11). Dưới đây là sơ đồ cấu trúc lớp để hỗ trợ hai phương thức triển khai này và các lớp (hoặc giao diện) cơ sở trừu tượng của các lớp này.

Sơ đồ lớp gồm các lớp cơ sở trừu tượng và các phương thức triển khai dành riêng cho từng phiên bản.

Hình 1. Sơ đồ lớp gồm các lớp cơ sở trừu tượng và các phương thức triển khai dành riêng cho từng phiên bản.

Thẻ Hành động trừu tượng

Bắt đầu xây dựng lớp trừu tượng thẻ bằng cách tạo một lớp trừu tượng đại diện cho một 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 lớp trừu tượng thay vì giao diện tại đây để đơn giản hoá quá trình triển khai các tính năng phổ biến, chẳng hạn như liên kết đối tượng thẻ với hoạt động (không xuất hiện trong đoạn mã).

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 thẻ vào một hoạt động, chẳng hạn như ActionBar.newTab()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 TabHelperCompatTab để hoạt động trên cả phiên bản nền tảng cũ và mới.

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