פשט את ממשקי ה-API החדשים

נניח שאתם רוצים להשתמש בכרטיסיות בסרגל הפעולות כצורת הניווט הראשית ברמת העליונה באפליקציה. לצערנו, ממשקי ה-API של ActionBar זמינים רק ב-Android 3.0 ואילך (רמת API 11 ואילך). לכן, אם אתם רוצים להפיץ את האפליקציה למכשירים עם גרסאות קודמות של הפלטפורמה, עליכם לספק הטמעה שתומכת ב-API החדש יותר תוך מתן מנגנון חלופי שמשתמש בממשקי API ישנים יותר.

בכיתה הזו, בונים רכיב של ממשק משתמש (UI) עם כרטיסיות, שמשתמש במחלקות מופשטות עם הטמעות ספציפיות לגרסה כדי לספק תאימות לאחור. בשיעור הזה נסביר איך ליצור שכבת הפשטה עבור ממשקי ה-API של הכרטיסייה החדשה, כשלב הראשון בתהליך הבנייה של רכיב הכרטיסייה.

הכנה ליצירת הפשטה

הכללה בשפת התכנות Java כוללת יצירה של ממשק אחד או יותר או של כיתות מופשטים כדי להסתיר את פרטי ההטמעה. במקרה של ממשקי API חדשים יותר של Android, אפשר להשתמש בהפשטה כדי ליצור רכיבים שמותאמים לגרסה, שמשתמשים בממשקי ה-API הנוכחיים במכשירים חדשים יותר, ועוברים לממשקי API ישנים יותר ותואמים יותר במכשירים ישנים יותר.

כשמשתמשים בגישה הזו, קודם קובעים באילו כיתות חדשות יותר רוצים להשתמש באופן של תאימות לאחור, ואז יוצרים מחלקות מופשטות על סמך הממשקים הציבוריים של המחלקות החדשות יותר. כשמגדירים את ממשקי האובייקטים המופשטים, צריך לשקף את ה-API החדש ככל האפשר. כך ניתן לשפר את התאימות קדימה ומקל על הסרת שכבת ההפשטה בעתיד כאשר לא יהיה יותר צורך בה.

אחרי שיוצרים מחלקות מופשטות לממשקי ה-API החדשים, אפשר ליצור ולבחור כל מספר של הטמעות בזמן הריצה. למטרות תאימות לאחור, ההטמעות האלה עשויות להשתנות בהתאם לרמת ה-API הנדרשת. לכן, בהטמעה אחת יכולים להשתמש בממשקי API שפורסמו לאחרונה, ובאחרות יכולים להשתמש בממשקי API ישנים יותר.

יצירת ממשק כרטיסיות מופשט

כדי ליצור גרסת כרטיסיות תואמת לאחור, צריך תחילה לקבוע אילו תכונות וממשקי API ספציפיים נדרשים לאפליקציה שלכם. במקרה של כרטיסיות של קטעים ברמה העליונה, נניח שיש לכם את הדרישות הפונקציונליות הבאות:

  1. מחווני הכרטיסיות צריכים להציג טקסט וסמל.
  2. ניתן לשייך כרטיסיות למופע של מקטעים.
  3. לפעילות צריכה להיות אפשרות להאזין לשינויים בכרטיסיות.

הכנה מראש של הדרישות האלה מאפשרת לכם לשלוט בהיקף של שכבת ההפשטה. המשמעות היא שתוכלו להשקיע פחות זמן ביצירה של הטמעות מרובות של שכבת ההפשטה ולהתחיל להשתמש בהטמעה החדשה שתואמת לאחור מוקדם יותר.

ממשקי ה-API העיקריים של הכרטיסיות נמצאים ב-ActionBar וב-ActionBar.Tab. אלה ממשקי ה-API שצריך ליצור להם אבסטרקציה כדי שהכרטיסיות יהיו מודעות לגרסה. הדרישות לפרויקט לדוגמה הזה כוללות תאימות לאפליקציות מגרסה Eclair (רמת API 5) ועד Honeycomb (רמת API 11), תוך ניצול התכונות החדשות של הכרטיסיות ב-Honeycomb. תרשים של מבנה המחלקה שיתמוך בשני ההטמעות האלה וסיווגי הבסיס (או הממשקים) המופשטים שלהם מוצג בהמשך.

תרשים מחלקה של מחלקות בסיס מופשטות והטמעות ספציפיות לגרסה.

איור 1. תרשים מחלקה של מחלקות בסיס מופשטות והטמעות ספציפיות לגרסה.

אב טיפוס ActionBar.Tab

כדי להתחיל ליצור את שכבת הפשטה של הכרטיסיות, אפשר ליצור כיתה מופשטת שמייצגת כרטיסייה שמשקפת את הממשק של ActionBar.Tab:

Kotlin

sealed class CompatTab(val tag: String) {
    ...
    abstract fun getText(): CharSequence
    abstract fun getIcon(): Drawable
    abstract fun getCallback(): CompatTabListener
    abstract fun getFragment(): Fragment

    abstract fun setText(text: String): CompatTab
    abstract fun setIcon(icon: Drawable): CompatTab
    abstract fun setCallback(callback: CompatTabListener): CompatTab
    abstract fun setFragment(fragment: Fragment): CompatTab
    ...
}

Java

public abstract class CompatTab {
    ...
    public abstract CompatTab setText(int resId);
    public abstract CompatTab setIcon(int resId);
    public abstract CompatTab setTabListener(
            CompatTabListener callback);
    public abstract CompatTab setFragment(Fragment fragment);

    public abstract CharSequence getText();
    public abstract Drawable getIcon();
    public abstract CompatTabListener getCallback();
    public abstract Fragment getFragment();
    ...
}

אפשר להשתמש כאן בכיתה מופשטת במקום בממשק כדי לפשט את ההטמעה של תכונות נפוצות, כמו שיוך של אובייקטים של כרטיסיות לפעילויות (לא מוצג בקטע הקוד).

שיטות מופשטים של כרטיסיות ב-ActionBar

בשלב הבא, מגדירים מחלקה מופשטת שמאפשרת ליצור ולהוסיף כרטיסיות לפעילות, כמו ActionBar.newTab() ו-ActionBar.addTab():

Kotlin

sealed class TabHelper(protected val activity: FragmentActivity) {
    ...

    abstract fun setUp()

    fun newTab(tag: String): CompatTab {
        // This method is implemented in a later lesson.
    }

    abstract fun addTab(tab: CompatTab)

    ...
}

Java

public abstract class TabHelper {
    ...

    public CompatTab newTab(String tag) {
        // This method is implemented in a later lesson.
    }

    public abstract void addTab(CompatTab tab);

    ...
}

בשיעורים הבאים תיצרו הטמעות ל-TabHelper ול-CompatTab, שפועלות גם בגרסה הישנה וגם בגרסה חדשה יותר של הפלטפורמה.

כדאי גם לקרוא את המאמרים הבאים: