یک پیاده سازی با API های قدیمی ایجاد کنید

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

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

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

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

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

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

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

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

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

برای ایجاد یک پیاده‌سازی قدیمی‌تر از تب‌های نوار اکشن، می‌توانید از TabWidget و TabHost استفاده کنید (اگرچه می‌توان به طور جایگزین از ویجت‌های Button با چیدمان افقی استفاده کرد). این را در کلاس‌هایی به نام TabHelperEclair و CompatTabEclair پیاده‌سازی کنید، زیرا این پیاده‌سازی از APIهایی استفاده می‌کند که دیرتر از اندروید ۲.۰ (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 دارید: یکی که روی دستگاه‌هایی با اندروید ۳.۰ یا بالاتر کار می‌کند و از APIهای جدید استفاده می‌کند، و دیگری که روی دستگاه‌هایی با اندروید ۲.۰ یا بالاتر کار می‌کند و از APIهای قدیمی‌تر استفاده می‌کند. درس بعدی در مورد استفاده از این پیاده‌سازی‌ها در برنامه شما بحث خواهد کرد.