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

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

اتخاذ قرار بديل

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

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