已弃用的 Leanback 界面工具包提供了一些仅供为 Android TV OS 开发的应用使用的 TV 专用库。这些库包括:
- Leanback 库:提供可简化 Android TV 应用创建过程的界面模板。
- Leanback Preferences 库:提供与平台一致但可设置主题以匹配您的应用的偏好设置和设置界面。
- Leanback Paging 库:支持
ObjectAdapters
的 AndroidX 分页模型,该模型通常与 Leanback 模板搭配使用。 - Leanback Tabs 库:支持在 Android TV 上进行标签页式导航。
Leanback 分页库
Leanback 界面工具包中的分页功能与 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
中:
Kotlin
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 Tabs 库
Leanback 界面工具包模板在浏览界面中提供侧边导航。如需在应用顶部横向添加一行标签页,您可以改用 Leanback 标签页。
为您的项目添加库依赖项:
implementation "androidx.leanback:leanback-tab:$version"
然后,按照现有的 ViewPager 指南,使用 LeanbackTabLayout
和 LeanbackViewPager
实现标签页。请注意,LeanbackViewPager
基于 ViewPager
,而不是 ViewPager2
。
示例如下:
Kotlin
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 上按钮,控制权会移回标签页,而不是停留在 fragment 内并导航到其上方的项(请参见图 1)。为处理此问题,fragment 内的内容必须替换焦点搜索;例如,使用 RowsSupportFragment
。
BrowseSupportFragment
无法在标签页内使用,因为它具有被覆盖的焦点搜索方法,该方法会阻止焦点移回标签页。