כדי להראות למשתמשים חדשים איך להפיק את המרב מהאפליקציה, כדאי להציג מידע על תהליך ההצטרפות כשהאפליקציה מופעלת. הנה כמה דוגמאות למידע על תהליך ההצטרפות:
- הצגת מידע מפורט על הערוצים שזמינים כשמשתמש נכנס בפעם הראשונה לאפליקציית ערוץ.
- להבליט תכונות חשובות באפליקציה.
- להמחיש את השלבים הנדרשים או המומלצים שהמשתמשים צריכים לבצע כשהם משתמשים באפליקציה בפעם הראשונה.
ספריית androidx.leanback מספקת את המחלקה OnboardingSupportFragment להצגת מידע למשתמשים בפעם הראשונה. במדריך הזה מוסבר איך להשתמש במחלקה OnboardingSupportFragment כדי להציג מידע מבוא שמוצג כשהאפליקציה מופעלת בפעם הראשונה.
OnboardingSupportFragment משתמש בשיטות מומלצות לממשק משתמש של טלוויזיה כדי להציג מידע באופן שתואם לסגנונות של ממשק משתמש של טלוויזיה, וקל להתמצא בו במכשירי טלוויזיה.
איור 1. דוגמה ל-OnboardingSupportFragment.
השימוש ב-OnboardingSupportFragment לא מתאים לכל תרחיש.
אל תשתמשו ב-OnboardingSupportFragment כשאתם צריכים לכלול רכיבים בממשק המשתמש שנדרש בהם קלט של משתמשים, כמו כפתורים ושדות.
בנוסף, לא מומלץ להשתמש ב-OnboardingSupportFragment למשימות שהמשתמש יבצע באופן קבוע. לבסוף, אם אתם צריכים להציג ממשק משתמש מרובה-דפים שדורש קלט של משתמשים, כדאי להשתמש ב-GuidedStepSupportFragment.
הוספת OnboardingSupportFragment
כדי להוסיף OnboardingSupportFragment לאפליקציה, מטמיעים מחלקה שמרחיבה את המחלקה OnboardingSupportFragment. מוסיפים את קטע הקוד הזה לפעילות, באמצעות פריסת ה-XML של הפעילות או באופן פרוגרמטי. מוודאים שהפעילות או הקטע משתמשים בעיצוב שנגזר מ-Theme_Leanback_Onboarding, כמו שמתואר בקטע התאמה אישית של עיצובים.
בשיטה onCreate() של הפעילות הראשית באפליקציה, קוראים ל-startActivity() עם Intent שמצביע על פעילות האב של OnboardingSupportFragment.
כך תוכלו לוודא שסמל האפליקציה OnboardingSupportFragment יוצג ברגע שהאפליקציה תופעל.
כדי לוודא שהמודעה OnboardingSupportFragment תוצג רק בפעם הראשונה שהמשתמש מפעיל את האפליקציה, צריך להשתמש באובייקט SharedPreferences כדי לעקוב אחרי הצגת המודעה OnboardingSupportFragment למשתמש. מגדירים ערך בוליאני
שמשתנה ל-true כשהמשתמש מסיים לצפות בOnboardingSupportFragment. בודקים את הערך הזה בשיטה onCreate() של הפעילות הראשית ומתחילים את פעילות האב OnboardingSupportFragment רק אם הערך הוא false.
בדוגמה הבאה מוצגת החלפה של onCreate() שבודקת אם הערך של SharedPreferences הוא true, ואם לא, מפעילה את startActivity() כדי להציג את OnboardingSupportFragment:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) PreferenceManager.getDefaultSharedPreferences(this).apply { // Check if we need to display our OnboardingSupportFragment if (!getBoolean(MyOnboardingSupportFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) { // The user hasn't seen the OnboardingSupportFragment yet, so show it startActivity(Intent(this@OnboardingActivity, OnboardingActivity::class.java)) } } }
Java
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); // Check if we need to display our OnboardingSupportFragment if (!sharedPreferences.getBoolean( MyOnboardingSupportFragment.COMPLETED_ONBOARDING_PREF_NAME, false)) { // The user hasn't seen the OnboardingSupportFragment yet, so show it startActivity(new Intent(this, OnboardingActivity.class)); } }
אחרי שהמשתמש צופה ב-OnboardingSupportFragment, מסמנים אותו כנצפה באמצעות האובייקט SharedPreferences. כדי לעשות זאת, צריך לבטל את ההגדרה של onFinishFragment() ב-OnboardingSupportFragment ולהגדיר את הערך של SharedPreferences ל-true, כמו בדוגמה הבאה:
Kotlin
override fun onFinishFragment() { super.onFinishFragment() // User has seen OnboardingSupportFragment, so mark our SharedPreferences // flag as completed so that we don't show our OnboardingSupportFragment // the next time the user launches the app PreferenceManager.getDefaultSharedPreferences(context).edit().apply { putBoolean(COMPLETED_ONBOARDING_PREF_NAME, true) apply() } }
Java
@Override protected void onFinishFragment() { super.onFinishFragment(); // User has seen OnboardingSupportFragment, so mark our SharedPreferences // flag as completed so that we don't show our OnboardingSupportFragment // the next time the user launches the app SharedPreferences.Editor sharedPreferencesEditor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); sharedPreferencesEditor.putBoolean( COMPLETED_ONBOARDING_PREF_NAME, true); sharedPreferencesEditor.apply(); }
הוספה של דפים מסוג OnboardingSupportFragment
OnboardingSupportFragment
מציג תוכן בסדרה של דפים מסודרים. אחרי שמוסיפים את OnboardingSupportFragment, צריך להגדיר את דפי ההצטרפות. לכל דף יכולה להיות כותרת, תיאור וכמה תצוגות משנה שיכולות להכיל תמונות או אנימציות.

איור 2. OnboardingSupportFragment
רכיבי דף.
איור 2 מציג דוגמה לדף עם הסברים שמסמנים רכיבים בדף שאפשר להתאים אישית וש-OnboardingSupportFragment יכול לספק. מרכיבי הדף הם:
- כותרת הדף.
- תיאור הדף.
- תצוגת התוכן של הדף, במקרה הזה סימן וי ירוק פשוט בתוך תיבה אפורה. התצוגה הזו היא אופציונלית. אפשר להשתמש בתצוגה הזו כדי להציג פרטים על הדף. לדוגמה, אפשר לכלול צילום מסך שמדגיש את התכונה של האפליקציה שמתוארת בדף.
- תצוגת הרקע של הדף, במקרה הזה גרדיאנט כחול פשוט. התצוגה הזו תמיד מוצגת מאחורי תצוגות אחרות בדף. התצוגה הזו היא אופציונלית.
- תצוגת החלק הקדמי של הדף, במקרה הזה לוגו. התצוגה הזו תמיד מוצגת לפני כל התצוגות האחרות בדף. התצוגה הזו היא אופציונלית.
צריך לאתחל את פרטי הדף כשיוצרים את OnboardingSupportFragment או מצרפים אותו לפעילות האב, כי המערכת מבקשת את פרטי הדף כשהיא יוצרת את התצוגה של הפראגמנט. אפשר לאתחל את פרטי הדף בבונה הכיתה או בביטול של onAttach().
צריך לבטל את השימוש בכל אחת מהשיטות הבאות, שמספקות למערכת מידע על הדף:
-
getPageCount()מחזירה את מספר העמודים ב-OnboardingSupportFragment. -
getPageTitle()מחזירה את הכותרת של מספר הדף המבוקש. -
getPageDescription()מחזירה את התיאור של מספר הדף המבוקש.
צריך להגדיר מחדש כל אחת מהשיטות הבאות כדי לספק תצוגות משנה אופציונליות להצגת תמונות או אנימציות:
onCreateBackgroundView()מחזירהViewשיוצרים כדי שתשמש כתצוגת הרקע, או null אם לא נדרשת תצוגת רקע.onCreateContentView()מחזירהViewשיוצרים כדי שתשמש כתצוגת התוכן, או null אם לא נדרשת תצוגת תוכן.onCreateForegroundView()מחזירהViewשיוצרים כדי שתשמש כתצוגה של קדמת התמונה, או null אם לא נדרשת תצוגה של קדמת התמונה.
המערכת מוסיפה את View שאתם יוצרים לפריסת הדף. בדוגמה הבאה, הערך של onCreateContentView() מוחלף ומוחזר ImageView:
Kotlin
private lateinit var contentView: ImageView ... override fun onCreateContentView(inflater: LayoutInflater?, container: ViewGroup?): View? { return ImageView(context).apply { scaleType = ImageView.ScaleType.CENTER_INSIDE setImageResource(R.drawable.onboarding_content_view) setPadding(0, 32, 0, 32) contentView = this } }
Java
private ImageView contentView; ... @Override protected View onCreateContentView(LayoutInflater inflater, ViewGroup container) { contentView = new ImageView(getContext()); contentView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); contentView.setImageResource(R.drawable.onboarding_content_view); contentView.setPadding(0, 32, 0, 32); return contentView; }
הוספת מסך לוגו ראשוני
האפליקציה שלכם OnboardingSupportFragment יכולה להתחיל עם מסך לוגו אופציונלי שמציג את האפליקציה. אם אתם רוצים להציג Drawable כמסך הלוגו, צריך להתקשר אל setLogoResourceId() עם המזהה של Drawable בשיטת onCreate() של OnboardingSupportFragment.
המערכת מציגה את Drawable בהדרגה לזמן קצר, ואז מעלימה את Drawable בהדרגה לפני הצגת הדף הראשון של OnboardingSupportFragment.
אם רוצים לספק אנימציה מותאמת אישית למסך הלוגו, במקום לקרוא ל-setLogoResourceId(), מחליפים את onCreateLogoAnimation() ומחזירים אובייקט Animator שמציג את האנימציה המותאמת אישית, כמו בדוגמה הבאה:
Kotlin
public override fun onCreateLogoAnimation(): Animator = AnimatorInflater.loadAnimator(context, R.animator.onboarding_logo_screen_animation)
Java
@Override public Animator onCreateLogoAnimation() { return AnimatorInflater.loadAnimator(getContext(), R.animator.onboarding_logo_screen_animation); }
התאמה אישית של אנימציות בדף
המערכת משתמשת באנימציות שמוגדרות כברירת מחדל כשהדף הראשון של OnboardingSupportFragment מוצג וכשהמשתמש עובר לדף אחר. אפשר להתאים אישית את האנימציות האלה על ידי שינוי של שיטות ב-OnboardingSupportFragment.
כדי להתאים אישית את האנימציה שמופיעה בדף הראשון, צריך להגדיר את האפשרות override
onCreateEnterAnimation()
ולהחזיר את הערך Animator.
בדוגמה הבאה נוצר Animator שמשנה את גודל התצוגה של התוכן באופן אופקי:
Kotlin
override fun onCreateEnterAnimation(): Animator = ObjectAnimator.ofFloat(contentView, View.SCALE_X, 0.2f, 1.0f) .setDuration(ANIMATION_DURATION)
Java
@Override protected Animator onCreateEnterAnimation() { Animator startAnimator = ObjectAnimator.ofFloat(contentView, View.SCALE_X, 0.2f, 1.0f).setDuration(ANIMATION_DURATION); return startAnimator; }
כדי להתאים אישית את האנימציה שמוצגת כשהמשתמש עובר לדף אחר, צריך לבטל את ברירת המחדל של onPageChanged().
בשיטה onPageChanged(), יוצרים אובייקטים של Animator שמסירים את הדף הקודם ומציגים את הדף הבא, מוסיפים אותם ל-AnimatorSet ומפעילים את הסט. בדוגמה הבאה נעשה שימוש באנימציית דהייה כדי להסיר את הדף הקודם, מתבצע עדכון של תמונת התצוגה של התוכן, ונעשה שימוש באנימציית הופעה כדי להציג את הדף הבא:
Kotlin
override fun onPageChanged(newPage: Int, previousPage: Int) { // Create a fade-out animation for previousPage and, once // done, swap the contentView image with the next page's image val fadeOut = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 1.0f, 0.0f) .setDuration(ANIMATION_DURATION) .apply { addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { mContentView.setImageResource(pageImages[newPage]) } }) } // Create a fade-in animation for nextPage val fadeIn = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 0.0f, 1.0f) .setDuration(ANIMATION_DURATION) // Create AnimatorSet with fade-out and fade-in animators and start it AnimatorSet().apply { playSequentially(fadeOut, fadeIn) start() } }
Java
@Override protected void onPageChanged(final int newPage, int previousPage) { // Create a fade-out animation for previousPage and, once // done, swap the contentView image with the next page's image Animator fadeOut = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 1.0f, 0.0f).setDuration(ANIMATION_DURATION); fadeOut.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mContentView.setImageResource(pageImages[newPage]); } }); // Create a fade-in animation for nextPage Animator fadeIn = ObjectAnimator.ofFloat(mContentView, View.ALPHA, 0.0f, 1.0f).setDuration(ANIMATION_DURATION); // Create AnimatorSet with fade-out and fade-in animators and start it AnimatorSet set = new AnimatorSet(); set.playSequentially(fadeOut, fadeIn); set.start(); }
מידע נוסף על יצירת אובייקטים מסוג Animator ואובייקטים מסוג AnimatorSet זמין במאמר
סקירה כללית על אנימציה של מאפיינים.
התאמה אישית של העיצובים
כל הטמעה של OnboardingSupportFragment צריכה להשתמש בעיצוב Theme_Leanback_Onboarding או בעיצוב שמוגדר כירושה מ-Theme_Leanback_Onboarding. כדי להגדיר את העיצוב של OnboardingSupportFragment, מבצעים אחת מהפעולות הבאות:
- מגדירים את פעילות האב של
OnboardingSupportFragmentכך שתשתמש בעיצוב הרצוי. בדוגמה הבאה מוצג איך להגדיר Activity לשימוש ב-Theme_Leanback_Onboardingבקובץ מניפסט של אפליקציה:<activity android:name=".OnboardingActivity" android:enabled="true" android:exported="true" android:theme="@style/Theme.Leanback.Onboarding"> </activity>
-
מגדירים את העיצוב בפעילות האב באמצעות המאפיין
LeanbackOnboardingTheme_onboardingThemeבעיצוב פעילות מותאם אישית. מגדירים את המאפיין הזה כך שיצביע על ערכת נושא מותאמת אישית אחרת שרק אובייקטים מסוגOnboardingSupportFragmentבפעילות משתמשים בה. כדאי להשתמש בגישה הזו אם הפעילות כבר משתמשת בערכת נושא בהתאמה אישית ואתם לא רוצים להחיל סגנונותOnboardingSupportFragmentעל תצוגות אחרות בפעילות. - מחליפים את העיצוב
onProvideTheme()ומחזירים את העיצוב הרצוי. מומלץ להשתמש בגישה הזו אם כמה פעילויות משתמשות ב-OnboardingSupportFragmentאו אם פעילות האב לא יכולה להשתמש בערכת הנושא הרצויה. בדוגמה הבאה, הערך שלonProvideTheme()מוחלף ומוחזר הערךTheme_Leanback_Onboarding:Kotlin
override fun onProvideTheme(): Int = R.style.Theme_Leanback_Onboarding
Java
@Override public int onProvideTheme() { return R.style.Theme_Leanback_Onboarding; }