Устаревший набор инструментов 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
нельзя использовать внутри вкладки, так как у него есть переопределённый метод поиска фокуса, который предотвращает возврат фокуса на вкладку.