Библиотеки набора инструментов Leanback UI

Создавайте более эффективные проекты с помощью Compose.
Создавайте красивые пользовательские интерфейсы с минимальным количеством кода, используя Jetpack Compose для Android TV OS.

Устаревший набор инструментов Leanback UI предоставляет ряд библиотек, специфичных для телевизоров и предназначенных исключительно для приложений, разработанных под управлением Android TV OS. К таким библиотекам относятся следующие:

  • Библиотека Leanback : предоставляет шаблоны пользовательского интерфейса, упрощающие создание приложений для Android TV.
  • Библиотека настроек Leanback : предоставляет экраны настроек, соответствующие платформе, но которые можно оформить в соответствии с дизайном вашего приложения.
  • Библиотека Leanback Paging : поддерживает модель постраничной навигации AndroidX для ObjectAdapters , которые обычно используются с шаблонами Leanback.
  • Библиотека Leanback Tabs : поддерживает навигацию по вкладкам на Android TV.

Библиотека пейджинга Leanback

В библиотеке Leanback UI Paging работает аналогично библиотеке AndroidX Paging 3 , которая упрощает добавление постраничной навигации в 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 :

Котлин

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 toolkit обеспечивают боковую навигацию на экране просмотра . Чтобы добавить горизонтальный ряд вкладок в верхней части приложения, можно использовать Leanback Tabs.

Добавьте зависимость библиотеки в свой проект:

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

Затем реализуйте вкладки, используя LeanbackTabLayout и LeanbackViewPager следуя существующему руководству по ViewPager . Обратите внимание, что 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)

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 содержит ограничение на принудительное использование темы, которое предотвращает использование любой темы, не являющейся потомком Theme.AppCompat . Вы также можете использовать тему-мост для набора инструментов пользовательского интерфейса Leanback.

Перемещение фокуса с вкладок вверх

Когда высота макета превышает высоту экрана, и вы нажимаете кнопку «вверх» на D-pad, управление возвращается на вкладку вместо того, чтобы оставаться внутри фрагмента и переходить к элементу над ним (см. рисунок 1). Для решения этой проблемы содержимое фрагмента должно переопределять поиск фокуса; например, использовать RowsSupportFragment . BrowseSupportFragment нельзя использовать внутри вкладки, поскольку у него переопределен метод поиска фокуса, который препятствует возвращению фокуса на вкладку.

Рисунок 1. Кнопка «вверх» на D-pad перемещает фокус на клавишу Tab вместо предыдущего элемента.