פשט את ממשקי ה-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). תרשים של מבנה המחלקה שיתמוך בשני ההטמעות האלה וסיווגי הבסיס (או הממשקים) המופשטים שלהם מוצג בהמשך.

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

איור 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, שפועלות גם בגרסה הישנה וגם בגרסה חדשה יותר של הפלטפורמה.

כדאי גם לקרוא