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

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

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

  • Библиотека Leanback : предоставляет шаблоны пользовательского интерфейса, упрощающие создание приложений для Android TV.
  • Библиотека настроек Leanback : предоставляет экраны настроек и предпочтений, соответствующие платформе, но которые можно настроить в соответствии с тематикой вашего приложения.
  • Библиотека 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"

Затем следуйте документации по 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)

Ява

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.

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

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)

Ява

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 UI.

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

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

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