נניח שאתם רוצים להשתמש בכרטיסיות של סרגל פעולות כשיטת הניווט העיקרית ברמה העליונה באפליקציה שלכם. לצערנו, ממשקי ה-API של ActionBar זמינים רק ב-Android 3.0 ומעלה (רמת API 11 ומעלה). לכן, אם רוצים להפיץ את האפליקציה למכשירים עם גרסאות קודמות של הפלטפורמה, צריך לספק הטמעה שתומכת בממשק ה-API החדש יותר, וגם מנגנון חלופי שמשתמש בממשקי API ישנים יותר.
בשיעור הזה תלמדו איך ליצור רכיב של ממשק משתמש (UI) עם כרטיסיות, שמשתמש במחלקות מופשטות עם הטמעות ספציפיות לגרסה כדי לספק תאימות לאחור. בשיעור הזה נסביר איך ליצור שכבת הפשטה לממשקי ה-API של הכרטיסיות החדשות, כשלב הראשון ביצירת רכיב הכרטיסייה.
הכנה להפשטה
אבסטרקציה בשפת התכנות Java כוללת יצירה של ממשק אחד או יותר או של מחלקות אבסטרקטיות כדי להסתיר פרטי הטמעה. במקרה של ממשקי API חדשים יותר של Android, אפשר להשתמש בהפשטה כדי לבנות רכיבים שמודעים לגרסה ומשתמשים בממשקי ה-API הנוכחיים במכשירים חדשים יותר, וחוזרים לממשקי API ישנים ותואמים יותר במכשירים ישנים יותר.
כשמשתמשים בגישה הזו, קודם קובעים באילו כיתות חדשות רוצים להשתמש באופן שתואם לאחור, ואז יוצרים כיתות מופשטות על סמך הממשקים הציבוריים של הכיתות החדשות. כשמגדירים את ממשקי ההפשטה, צריך לשקף את ה-API החדש ככל האפשר. כך אפשר למקסם את התאימות קדימה ולהסיר בקלות את שכבת ההפשטה בעתיד, כשכבר לא יהיה בה צורך.
אחרי שיוצרים מחלקות אבסטרקטיות לממשקי ה-API החדשים האלה, אפשר ליצור ולבחור כל מספר של הטמעות בזמן הריצה. לצורך תאימות לאחור, יכול להיות שיהיו הבדלים בין ההטמעות האלה בהתאם לרמת ה-API הנדרשת. לכן, יכול להיות שבהטמעה אחת נעשה שימוש בממשקי API שפורסמו לאחרונה, ובאחרת נעשה שימוש בממשקי API ישנים יותר.
יצירת ממשק מופשט של כרטיסיות
כדי ליצור גרסה של כרטיסיות שתואמת לאחור, צריך קודם לקבוע אילו תכונות וממשקי API ספציפיים נדרשים באפליקציה. במקרה של כרטיסיות של קטע ברמה העליונה, נניח שיש לכם את הדרישות הפונקציונליות הבאות:
- באינדיקטורים של הכרטיסיות צריך להופיע טקסט וסמל.
- אפשר לשייך כרטיסיות למופע של קטע.
- הפעילות צריכה להיות מסוגלת להאזין לשינויים בכרטיסיות.
אם תכינו את הדרישות האלה מראש, תוכלו לשלוט בהיקף של שכבת ההפשטה. כלומר, תוכלו להקדיש פחות זמן ליצירת הטמעות מרובות של שכבת ההפשטה ולהתחיל להשתמש בהטמעה החדשה שתואמת לאחור מוקדם יותר.
ממשקי ה-API העיקריים לכרטיסיות נמצאים ב-ActionBar וב-ActionBar.Tab. אלה ממשקי ה-API שצריך לבצע בהם הפשטה כדי שהכרטיסיות יתאימו לגרסה. הדרישות של פרויקט הדוגמה הזה הן תאימות לאחור עד Eclair (רמת API 5) תוך ניצול היתרונות של התכונות החדשות של הכרטיסיות ב-Honeycomb (רמת API 11). בהמשך מופיעה דיאגרמה של מבנה המחלקה לתמיכה בשני היישומים האלה ובמחלקה הבסיסית המופשטת שלהם (או בממשקים שלהם).
Abstract 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 שפועלות בגרסאות ישנות וחדשות של הפלטפורמה.