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