يتناول هذا الدرس كيفية إنشاء عملية تنفيذ تعكس واجهات برمجة التطبيقات الأحدث مع إتاحتها على الأجهزة القديمة.
تحديد حل بديل
إنّ المهمة الأكثر صعوبة في استخدام ميزات واجهة المستخدم الأحدث بطريقة متوافقة مع الإصدارات السابقة هي تحديد حل أقدم (احتياطي) وتنفيذه لإصدارات المنصة القديمة. في العديد من الحالات، من الممكن تحقيق الغرض من مكوّنات واجهة المستخدم الأحدث هذه باستخدام ميزات إطار عمل واجهة المستخدم الأقدم. على سبيل المثال:
-
يمكن تنفيذ أشرطة الإجراءات باستخدام
LinearLayoutأفقي يحتوي على أزرار صور، إما كأشرطة عناوين مخصّصة أو كطرق عرض في تخطيط نشاطك. يمكن عرض الإجراءات الكاملة ضمن زر القائمة على الجهاز. -
يمكن تنفيذ علامات تبويب شريط الإجراءات باستخدام
LinearLayoutأفقي يحتوي على أزرار، أو باستخدام عنصر في واجهة المستخدمTabWidget. -
يمكن تنفيذ أدوات
NumberPickerوSwitchباستخدام أدواتSpinnerوToggleButtonعلى التوالي. -
يمكن تنفيذ أدوات
ListPopupWindowوPopupMenuباستخدام أدواتPopupWindow.
لا يتوفّر بشكل عام حل واحد يناسب الجميع لنقل مكوّنات واجهة المستخدم الأحدث إلى الأجهزة القديمة. يُرجى مراعاة تجربة المستخدم: على الأجهزة القديمة، قد لا يكون المستخدمون على دراية بأنماط التصميم ومكوّنات واجهة المستخدم الأحدث. يُرجى التفكير في كيفية تقديم الوظيفة نفسها باستخدام عناصر مألوفة. في العديد من الحالات، لا يمثّل ذلك مشكلة كبيرة، مثلاً إذا كانت مكوّنات واجهة المستخدم الأحدث بارزة في النظام الأساسي للتطبيق (مثل شريط الإجراءات)، أو إذا كان نموذج التفاعل أساسيًا وبديهيًا (مثل طرق العرض التي يتم التمرير بينها باستخدام ViewPager).
تنفيذ علامات التبويب باستخدام واجهات برمجة التطبيقات الأقدم
لإنشاء عملية تنفيذ أقدم لعلامات تبويب شريط الإجراءات، يمكنك استخدام TabWidget وTabHost (على الرغم من أنّه يمكن بدلاً من ذلك استخدام أدوات Button مرتّبة أفقيًا). نفِّذ ذلك في الفئتَين اللتَين تُسمّيان TabHelperEclair وCompatTabEclair، لأنّ عملية التنفيذ هذه تستخدم واجهات برمجة التطبيقات التي تم طرحها في الإصدار Android 2.0 (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 أو إصدار أحدث وتستخدم واجهات برمجة التطبيقات الأقدم. يتناول الدرس التالي كيفية استخدام عمليات التنفيذ هذه في تطبيقك.