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

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

تحديد حل بديل

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

  • يمكن تنفيذ أشرطة الإجراءات باستخدام 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 أو إصدار أحدث وتستخدم واجهات برمجة التطبيقات الأقدم. يتناول الدرس التالي كيفية استخدام عمليات التنفيذ هذه في تطبيقك.