ספריות של ערכות הכלים לבניית ממשק משתמש ל-Leanback

פיתוח טוב יותר באמצעות Compose
אפשר ליצור ממשקי משתמש יפים עם מינימום קוד באמצעות Jetpack Compose ל-Android TV OS.

ערכת הכלים Leanback UI, שהוצאה משימוש, מספקת כמה ספריות ספציפיות לטלוויזיה שזמינות רק לאפליקציות שפותחו עבור Android TV OS. הספריות האלה כוללות את:

  • ספריית Leanback: מספקת תבניות של ממשק משתמש שמפשטות את יצירת האפליקציות ל-Android TV.
  • Leanback Preferences library: מספקת העדפות ומסכי הגדרות שתואמים לפלטפורמה, אבל אפשר להחיל עליהם עיצוב שיתאים לאפליקציה.
  • ספריית Leanback Paging: תומכת במודל של AndroidX להחלפת דפים ב-ObjectAdapters, שמשמשים בדרך כלל עם תבניות Leanback.
  • ספריית Leanback Tabs: תומכת בניווט באמצעות כרטיסיות ב-Android TV.

ספריית החלפה בין דפים ב-Leanback

החלוקה לדפים בערכת הכלים של Leanback UI פועלת כמו בספריית Paging 3 של AndroidX, שמפשטת את הוספת החלוקה לדפים ל-RecyclerView.Adapter. בספריית Leanback Paging, האובייקט של המתאם שנחשף הוא בדרך כלל ObjectAdapter, ולכן הספרייה מוסיפה תמיכה בהחלפה בין דפים ל-ObjectAdapter.

כדי להוסיף לאפליקציה מתאם להחלפת דפים, קודם מוסיפים את יחסי התלות של הספרייה לפרויקט:

implementation "androidx.leanback:leanback-paging:$version"

לאחר מכן, פועלים לפי המסמכים בנושא Paging 3 באמצעות androidx.leanback.paging.PagingDataAdapter במקום androidx.paging.PagingDataAdapter. ההבדל היחיד הוא שעכשיו אפשר להעביר Presenter או PresenterSelector. מקשי הקיצור האלה פועלים בכל מקום שבו בדרך כלל משתמשים ב-ObjectAdapter, למשל ב-ListRow:

Kotlin

val adapter: PagingDataAdapter<MyItem> = PagingDataAdapter(myPresenter,
   object : DiffUtil.ItemCallback<MyItem>() {
       override fun areItemsTheSame(
           oldItem: MyItem,
           newItem: MyItem
       ): Boolean {
           return oldItem.id === newItem.id
       }

       override fun areContentsTheSame(
           oldItem: MyItem,
           newItem: MyItem
       ): Boolean {
           return oldItem == newItem
       }
   })

val header = HeaderItem(headerTitle)
val row = ListRow(header, adapter)

Java

PagingDataAdapter<MyItem> adapter = new PagingDataAdapter(myPresenter, new DiffUtil.ItemCallback<MyItem>() {
    @Override
    public boolean areItemsTheSame(@NonNull MyItem oldItem, @NonNull MyItem newItem) {
        return oldItem.getId().equals(newItem.getId());
    }

    @Override
    public boolean areContentsTheSame(@NonNull MyItem oldItem, @NonNull MyItem newItem) {
        return oldItem.equals(newItem);
    }
});

HeaderItem header = new HeaderItem(headerTitle);
Row row = new ListRow(header, adapter);

ספריית הכרטיסיות של Leanback

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

מוסיפים את התלות של הפרויקט בספרייה:

implementation "androidx.leanback:leanback-tab:$version"

אחר כך מטמיעים כרטיסיות באמצעות LeanbackTabLayout ו-LeanbackViewPager לפי המדריך הקיים בנושא ViewPager. הערה: הערך של LeanbackViewPager מבוסס על ViewPager, ולא על ViewPager2.

לדוגמה:

Kotlin

val leanbackTabLayout = findViewById<LeanbackTabLayout>(R.id.tab_layout)
val leanbackViewPager = findViewById<LeanbackViewPager>(R.id.view_pager)

leanbackViewPager.setAdapter(adapter)
leanbackTabLayout.setupWithViewPager(leanbackViewPager)

Java

LeanbackTabLayout leanbackTabLayout = findViewById(R.id.tab_layout);
LeanbackViewPager leanbackViewPager = findViewById(R.id.view_pager);

leanbackViewPager.setAdapter(adapter);
leanbackTabLayout.setupWithViewPager(leanbackViewPager);

מגבלות

יש מגבלות בספריית Leanback Tabs בנוגע לערכות הנושא שהיא תומכת בהן ולאופן הטיפול בהעברת המיקוד.

נושאים נתמכים

יש תמיכה רק בערכות נושא שנגזרות מ-Theme.AppCompat. ‫TabLayout contains a theme enforcement constraint, which prevents any nondescendant theme of Theme.AppCompat from being used. אפשר גם להשתמש בעיצוב של Bridge עבור ערכת הכלים של ממשק המשתמש Leanback.

העברת המיקוד מהכרטיסיות לחלק העליון

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

איור 1. הלחצן 'למעלה' בכפתורי החיצים (D-pad) מעביר את המיקוד לכרטיסייה במקום לפריט הקודם.