Leanback UI 工具包库

使用 Compose 构建更出色的应用
使用 Jetpack Compose for Android TV OS,用最少的代码创建精美的 UI。

Leanback UI 工具包提供了一些特定于电视的库,这些库专供为 Android TV OS 开发的应用使用。这些库包括以下内容:

  • Leanback 库:提供简化 Android TV 应用创建的 UI 模板。
  • Leanback Preferences 库:提供与平台一致的首选项和设置屏幕,但可以对其进行主题设置以匹配您的应用。
  • 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。唯一的区别在于,您现在可以传入 PresenterPresenterSelector。这可以在您通常使用 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 指南 使用 LeanbackTabLayoutLeanbackViewPager 实现选项卡。请注意,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 工具包的桥接主题。

从选项卡到顶部的焦点移动

当布局高度大于屏幕高度并且您按下方向键向上按钮时,控件会返回到选项卡,而不是停留在片段内并导航到其上方的项目(请参见图 1)。要处理此问题,片段内的内容必须覆盖焦点搜索;例如,使用 RowsSupportFragmentBrowseSupportFragment 不能在选项卡内使用,因为它具有一个覆盖的焦点搜索方法,该方法阻止焦点返回到选项卡。

图 1. 方向键向上按钮将焦点移动到选项卡而不是前面的项目。