الخادم الوكيل لواجهات برمجة التطبيقات الجديدة

يوضِّح لك هذا الدرس كيفية وضع فئات فرعية للفئة المجرّدة CompatTab وTabHelper واستخدام واجهات برمجة تطبيقات جديدة. يمكن لتطبيقك استخدام هذا التنفيذ على الأجهزة التي تعمل بإصدار من النظام الأساسي يتيح ذلك.

تنفيذ علامات التبويب باستخدام واجهات برمجة التطبيقات الجديدة

إنّ الفئات المحددة لكلّ من CompatTab وTabHelper التي تستخدم واجهات برمجة تطبيقات أحدث هي خادم وكيل. بما أنّ الفئات المجردة المحدّدة في الدرس السابق تعكس واجهات برمجة التطبيقات الجديدة (بنية الفئة، وتوقيعات الطرق، وما إلى ذلك)، فإنّ الفئات المحدّدة التي تستخدم واجهات برمجة التطبيقات الأحدث تُمثّل ببساطة طلبات استدعاء الطرق ونتائجها.

يمكنك استخدام واجهات برمجة التطبيقات الأحدث مباشرةً في هذه الفئات المحدّدة، ولن يؤدي ذلك إلى حدوث أعطال على الأجهزة القديمة، وذلك بسبب تحميل الفئات بشكلٍ غير فوري. يتم تحميل الفصول وإعدادها عند أول وصول إليها، وذلك عن طريق إنشاء مثيل للفصل أو الوصول إلى أحد الحقول أو الطرق الثابتة فيه للمرة الأولى. ولهذا السبب، لن تنشئ Dalvik VM أي استثناءات VerifyError طالما أنّك لا تنشئ مثيلاً لعمليات التنفيذ الخاصة بـ Honeycomb على الأجهزة السابقة لـ Honeycomb.

من الممارسات الجيدة في عملية التنفيذ هذه إلحاق اسم رمز مستوى واجهة برمجة التطبيقات أو الإصدار الأساسي بالمنصة بما يتوافق مع واجهات برمجة التطبيقات المطلوبة من الفئات الملموسة. على سبيل المثال، يمكن أن توفّر الصفوف CompatTabHoneycomb وTabHelperHoneycomb علامة التبويب المدمجة مع المحتوى لأنّها تعتمد على واجهات برمجة التطبيقات المتوفّرة في الإصدار Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث.

مخطّط الفئة لتنفيذ علامات التبويب في Honeycomb

الشكل 1: مخطط لفئة تنفيذ Honeycomb لعلامات التبويب.

تنفيذ CompatTabHoneycomb

CompatTabHoneycomb هو تنفيذ الفئة المجردة CompatTab التي يستخدمها TabHelperHoneycomb للإشارة إلى علامات تبويب فردية. يعمل CompatTabHoneycomb ببساطة على إنشاء وكيل لجميع استدعاءات الطرق إلى كائن ActionBar.Tab الموجود.

ابدأ تنفيذ CompatTabHoneycomb باستخدام واجهات برمجة تطبيقات ActionBar.Tab الجديدة:

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.)
}

تنفيذ TabHelperHoneycomb

الدالة TabHelperHoneycomb هي تنفيذ لفئة TabHelper مجرّدة تعمل على إرسال استدعاءات طريقة وكيلة إلى ActionBar فعلية، ويتم الحصول عليها من Activity المضمّنة.

نفِّذ TabHelperHoneycomb، الذي يشفّر طلبات استدعاء الطريقة إلى واجهة برمجة التطبيقات 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.
}

ننصحك أيضًا بقراءة