Leanback UI 工具包提供了一些仅适用于为 Android TV OS 开发的应用的特定于电视的库。这些库包括以下内容
- Leanback 库:提供简化 Android TV 应用创建的 UI 模板。
- Leanback 首选项 库:提供与平台一致的首选项和设置屏幕,但可以对其主题进行调整以匹配您的应用。
- Leanback 分页 库:支持
ObjectAdapters
的 AndroidX 分页模型,这些模型通常与 Leanback 模板一起使用。 - Leanback 选项卡 库:支持 Android TV 上的选项卡式导航。
Leanback 分页库
Leanback UI 工具包中的分页与 AndroidX Paging 3 库的工作方式相同,该库简化了向 RecyclerView.Adapter
添加分页的过程。使用 Leanback 分页库,公开的适配器通常是 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 选项卡库
Leanback UI 工具包模板在 浏览屏幕 中提供侧边导航。要添加一行选项卡横跨应用顶部,您可以改用 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 选项卡库在其支持的主题和焦点移动处理方式方面存在一些限制。
支持的主题
仅支持从 Theme.AppCompat
派生的主题。TabLayout
包含一个主题强制约束,该约束阻止使用任何不是 Theme.AppCompat
的后代主题。您还可以使用 Leanback UI 工具包的桥接主题。
从选项卡到顶部的焦点移动
当布局高度大于屏幕高度并且您按下 D 方向键向上按钮时,控件会移动回选项卡,而不是停留在片段内部并导航到其上方的项目(请参见图 1)。要处理此问题,片段内部的内容必须覆盖焦点搜索;例如,使用 RowsSupportFragment
。BrowseSupportFragment
不能在选项卡内使用,因为它具有一个覆盖的焦点搜索方法,该方法阻止焦点移动回选项卡。