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

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

Набор инструментов Leanback UI предоставляет некоторые библиотеки для ТВ, эксклюзивные для приложений, разработанных для ОС Android TV. Эти библиотеки включают в себя следующее:

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

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

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

Рис. 1. Кнопка «Вверх» на крестовине перемещает фокус на вкладку, а не на предыдущий элемент.