ایجاد پیاده‌سازی با میاناهای برنامه‌سازی کاربردی قدیمی‌تر

این درس درباره نحوه ایجاد پیاده‌سازی‌ای بحث می‌کند که میاناهای برنامه‌سازی کاربردی جدیدتر را منعکس می‌کند و درعین‌حال از دستگاه‌های قدیمی‌تر پشتیبانی می‌کند.

تصمیم‌گیری درباره راه‌حل جایگزین

چالش‌برانگیزترین کار در استفاده از ویژگی‌های جدیدتر میانای کاربری به‌صورت سازگار با نسخه‌های قدیمی، تصمیم‌گیری و پیاده‌سازی یک راه‌حل قدیمی‌تر (جایگزین) برای نسخه‌های قدیمی‌تر پلاتفرم است. در بسیاری از موارد، می‌توان هدف این عناصر جدیدتر رابط کاربری را بااستفاده از ویژگی‌های چارچوب رابط کاربری قدیمی‌تر برآورده کرد. برای مثال:

  • نوار اقدام را می‌توان بااستفاده از LinearLayout افقی حاوی دکمه‌های تصویری، به‌عنوان نوار عنوان سفارشی یا به‌عنوان نما در چیدمان فعالیت پیاده‌سازی کرد. کنش‌های سرریز را می‌توان زیر دکمه منو دستگاه ارائه کرد.

  • برگه‌های نوار اقدام را می‌توان بااستفاده از LinearLayout افقی حاوی دکمه‌ها یا بااستفاده از عنصر میانای کاربر TabWidget پیاده‌سازی کرد.

  • ابزاره‌های NumberPicker و Switch را می‌توان به‌ترتیب بااستفاده از ابزاره‌های Spinner و ToggleButton پیاده‌سازی کرد.

  • ابزاره‌های ListPopupWindow و PopupMenu را می‌توان بااستفاده از ابزاره‌های PopupWindow پیاده‌سازی کرد.

به‌طور کلی، راه‌حل واحدی برای انتقال مؤلفه‌های جدیدتر واسط کاربر به دستگاه‌های قدیمی‌تر وجود ندارد. به تجربه کاربری توجه داشته باشید: در دستگاه‌های قدیمی‌تر، ممکن است کاربران با الگوهای طراحی و مؤلفه‌های میانای کاربر جدیدتر آشنا نباشند. کمی فکر کنید که چگونه می‌توان همان عملکرد را بااستفاده از عناصر آشنا ارائه داد. در بسیاری از موارد این موضوع کمتر نگران‌کننده است—اگر مؤلفه‌های جدیدتر میانای کاربر در بوم‌سازگان برنامه برجسته باشند (مانند نوار اقدام)، یا جایی که مدل تعامل ساده و شهودی است (مانند نماهای تند کشیدن بااستفاده از ViewPager).

پیاده‌سازی زبانه‌ها بااستفاده از میاناهای برنامه‌سازی کاربردی قدیمی‌تر

برای ایجاد پیاده‌سازی قدیمی‌تر زبانه‌های نوار اقدام، می‌توانید از TabWidget و TabHost استفاده کنید (اگرچه می‌توان از ابزاره‌های Button با چیدمان افقی نیز استفاده کرد). این را در کلاس‌هایی به‌نام TabHelperEclair و CompatTabEclair پیاده‌سازی کنید، زیرا این پیاده‌سازی از میاناهای برنامه‌سازی کاربردی‌ای استفاده می‌کند که حداکثر در Android 2.0 (Eclair) معرفی شده‌اند.

نمودار کلاس برای پیاده‌سازی Eclair از برگه‌ها.
شکل ۱. نمودار کلاس برای پیاده‌سازی برگه‌ها در Eclair.

پیاده‌سازی CompatTabEclair ویژگی‌های برگه مانند نوشتار و نماد برگه را در متغیرهای نمونه ذخیره می‌کند، زیرا شیء ActionBar.Tab برای مدیریت این فضای ذخیره‌سازی دردسترس نیست:

کاتلین

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

جاوا

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 و نشانگرهای برگه استفاده می‌کند:

کاتلین

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

جاوا

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 یا بالاتر کار می‌کند و از میاناهای برنامه‌سازی کاربردی قدیمی‌تر استفاده می‌کند. درس بعدی درباره استفاده از این پیاده‌سازی‌ها در برنامه‌تان بحث می‌کند.