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

يناقش هذا الدرس كيفية إنشاء تطبيق يعكس واجهات برمجة التطبيقات الأحدث التي تتوافق مع الأجهزة القديمة.

تحديد حل بديل

تتمثل المهمة الأكثر صعوبة في استخدام ميزات واجهة المستخدم الجديدة بطريقة متوافقة مع الإصدارات القديمة في اتخاذ قرار بشأن وتنفيذ حل (احتياطي) قديم لإصدارات النظام الأساسي القديمة. في كثير من الحالات، من الممكن تحقيق الغرض من هذه المكونات الأحدث لواجهة المستخدم باستخدام الميزات القديمة لإطار عمل واجهة المستخدم. مثلاً:

  • يمكن تنفيذ أشرطة الإجراءات باستخدام LinearLayout أفقي يحتوي على أزرار صور، إما كأشرطة عناوين مخصصة أو كطرق عرض في تنسيق النشاط. يمكن عرض إجراءات القائمة الكاملة ضمن زر القائمة في الجهاز.

  • يمكن تنفيذ علامات تبويب شريط الإجراءات باستخدام علامة LinearLayout أفقية تحتوي على أزرار، أو باستخدام عنصر واجهة المستخدم TabWidget.

  • يمكن تنفيذ الأداتَين NumberPicker وSwitch باستخدام الأداتَين Spinner وToggleButton على التوالي.

  • يمكن تنفيذ التطبيقات المصغّرة ListPopupWindow وPopupMenu باستخدام التطبيقات المصغّرة PopupWindow.

لا يتوفّر بشكل عام حلّ واحد يناسب الجميع لإعادة نقل مكونات واجهة المستخدم الأحدث إلى الأجهزة القديمة. يجب مراعاة تجربة المستخدم: قد لا يكون المستخدمون على دراية بنماذج التصميم ومكونات واجهة المستخدم الأحدث على الأجهزة القديمة. فكِّر في كيفية تقديم الوظيفة نفسها باستخدام عناصر مألوفة. وفي كثير من الحالات، لا داعي للقلق بشأن ذلك، سواء كانت مكونات واجهة المستخدم الجديدة بارزة في المنظومة المتكاملة للتطبيقات (مثل شريط الإجراءات) أو عندما يكون نموذج التفاعل بسيطًا وسهلاً للغاية (مثل عروض التمرير السريع باستخدام ViewPager).

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

لإنشاء إصدار قديم من علامات تبويب شريط الإجراءات، يمكنك استخدام TabWidget وTabHost (على الرغم من أنّه يمكن استخدام التطبيقات المصغّرة Button بتنسيق أفقي كبديل). يمكنك تنفيذ ذلك في فئتَين باسم TabHelperEclair وCompatTabEclair، لأنّ هذا التنفيذ يستخدم واجهات برمجة تطبيقات تم طرحها في نظام التشغيل Android 2.0 (Eclair) أو إصدار أحدث.

رسم تخطيطي لفئة تنفيذ Eclair لعلامات التبويب

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

يخزِّن تنفيذ CompatTabEclair سمات علامة التبويب، مثل نص علامة التبويب ورمزها في متغيّرات المثال، بسبب عدم توفُّر عنصر ActionBar.Tab للتعامل مع مساحة التخزين هذه:

Kotlin

class CompatTabEclair internal constructor(val activity: FragmentActivity, tag: String) :
        CompatTab(tag) {

    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private var text: CharSequence? = null
    ...

    override fun setText(resId: Int): CompatTab {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.resources.getText(resId)
        return this
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

Java

public class CompatTabEclair extends CompatTab {
    // Store these properties in the instance,
    // as there is no ActionBar.Tab object.
    private CharSequence text;
    ...

    public CompatTab setText(int resId) {
        // Our older implementation simply stores this
        // information in the object instance.
        text = activity.getResources().getText(resId);
        return this;
    }

    ...
    // Do the same for other properties (icon, callback, etc.)
}

يتم تنفيذ TabHelperEclair بالاستفادة من الطرق المتاحة في التطبيق المصغّر "TabHost" لإنشاء كائنات TabHost.TabSpec ومؤشرات علامات التبويب:

Kotlin

class TabHelperEclair internal constructor(activity: FragmentActivity) : TabHelper(activity) {

    private var tabHost: TabHost? = null
    ...

    override fun setUp() {
        // Our activity layout for pre-Honeycomb devices
        // must contain a TabHost.
        tabHost = tabHost ?: mActivity.findViewById<TabHost>(android.R.id.tabhost).apply {
            setup()
        }
    }

    override fun addTab(tab: CompatTab) {
        ...
        tabHost?.newTabSpec(tab.tag)?.run {
            setIndicator(tab.getText()) // And optional icon
            ...
            tabHost?.addTab(this)
        }
    }
    // The other important method, newTab() is part of
    // the base implementation.
}

Java

public class TabHelperEclair extends TabHelper {
    private TabHost tabHost;
    ...

    protected void setUp() {
        if (tabHost == null) {
            // Our activity layout for pre-Honeycomb devices
            // must contain a TabHost.
            tabHost = (TabHost) mActivity.findViewById(
                    android.R.id.tabhost);
            tabHost.setup();
        }
    }

    public void addTab(CompatTab tab) {
        ...
        TabSpec spec = tabHost
                .newTabSpec(tag)
                .setIndicator(tab.getText()); // And optional icon
        ...
        tabHost.addTab(spec);
    }

    // The other important method, newTab() is part of
    // the base implementation.
}

لديك الآن طريقتَان لتنفيذ CompatTab وTabHelper: إحداهما تعمل على الأجهزة التي تعمل بنظام التشغيل Android 3.0 أو الإصدارات الأحدث وتستخدم واجهات برمجة تطبيقات جديدة، والأخرى تعمل على الأجهزة التي تعمل بنظام التشغيل Android 2.0 أو الإصدارات الأحدث وتستخدم واجهات برمجة تطبيقات قديمة. سيناقش الدرس التالي استخدام طرق التنفيذ هذه في تطبيقك.