کتابخانه های جعبه ابزار UI Leanback

با Compose بهتر بسازید
با استفاده از Jetpack Compose برای سیستم عامل Android TV، رابط‌های کاربری زیبایی با حداقل کد ایجاد کنید.

جعبه ابزار منسوخ‌شده‌ی رابط کاربری Leanback، برخی کتابخانه‌های مخصوص تلویزیون را ارائه می‌دهد که منحصراً برای برنامه‌های توسعه‌یافته برای سیستم عامل Android TV در نظر گرفته شده‌اند. این کتابخانه‌ها شامل موارد زیر هستند:

  • کتابخانه Leanback : قالب‌های رابط کاربری ارائه می‌دهد که ایجاد برنامه‌های Android TV را ساده می‌کند.
  • کتابخانه‌ی Leanback Preferences : صفحات تنظیمات و ترجیحات را ارائه می‌دهد که با پلتفرم سازگار هستند، اما می‌توانند برای مطابقت با برنامه‌ی شما، تم‌بندی شوند.
  • کتابخانه Leanback Paging : از مدل صفحه‌بندی AndroidX برای ObjectAdapters پشتیبانی می‌کند که معمولاً با قالب‌های Leanback استفاده می‌شوند.
  • کتابخانه‌ی زبانه‌های Leanback : از پیمایش زبانه‌دار در Android TV پشتیبانی می‌کند.

کتابخانه صفحه‌بندی Leanback

صفحه‌بندی در داخل جعبه ابزار Leanback UI همانند کتابخانه AndroidX Paging 3 کار می‌کند، که افزودن صفحه‌بندی به RecyclerView.Adapter را ساده می‌کند. با کتابخانه Leanback Paging، آداپتوری که در معرض نمایش قرار می‌گیرد معمولاً یک ObjectAdapter است، بنابراین کتابخانه پشتیبانی صفحه‌بندی را به ObjectAdapter اضافه می‌کند.

برای افزودن یک آداپتور صفحه‌بندی به برنامه خود، ابتدا وابستگی کتابخانه را به پروژه خود اضافه کنید:

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

سپس به جای androidx.leanback.paging.PagingDataAdapter از androidx.paging.PagingDataAdapter طبق مستندات Paging 3 استفاده کنید. تنها تفاوت این است که اکنون می‌توانید یک Presenter یا PresenterSelector ارسال کنید. این روش در هر جایی که معمولاً از ObjectAdapter استفاده می‌کنید، مانند یک ListRow ، کار می‌کند:

کاتلین

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)

جاوا

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، ناوبری جانبی را در صفحه مرور ارائه می‌دهند. برای اضافه کردن یک ردیف از تب‌ها به صورت افقی در بالای برنامه، می‌توانید از Leanback Tabs استفاده کنید.

وابستگی کتابخانه را به پروژه خود اضافه کنید:

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

سپس با دنبال کردن راهنمای موجود ViewPager، تب‌ها را با استفاده از LeanbackTabLayout و LeanbackViewPager پیاده‌سازی کنید. توجه داشته باشید که LeanbackViewPager مبتنی بر ViewPager است، نه ViewPager2 .

مثال زیر یک مثال است:

کاتلین

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

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

جاوا

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 شامل یک محدودیت اجرای تم است که از استفاده از هر تم غیر از Theme.AppCompat جلوگیری می‌کند. همچنین می‌توانید از تم bridge برای جعبه ابزار Leanback UI استفاده کنید.

حرکت فوکوس از تب‌ها به بالا

وقتی ارتفاع طرح‌بندی از ارتفاع صفحه نمایش بیشتر باشد و دکمه بالا را از D-pad فشار دهید، کنترل به جای اینکه داخل قطعه بماند و به آیتمی بالای آن برود، به برگه برمی‌گردد (شکل 1 را ببینید). برای حل این مشکل، محتویات داخل قطعه باید جستجوی فوکوس را لغو کنند. برای مثال، از RowsSupportFragment استفاده کنید. BrowseSupportFragment نمی‌توان داخل یک برگه استفاده کرد زیرا دارای یک متد جستجوی فوکوس لغو شده است که مانع از بازگشت فوکوس به برگه می‌شود.

شکل ۱. دکمه‌ی D-pad به سمت بالا، فوکوس را به جای آیتم قبلی، به تب منتقل می‌کند.