Leanback UI 工具包库

使用 Compose 构建更好的应用
使用适用于 Android TV OS 的 Jetpack Compose,用最少的代码创建精美的界面。

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

  • Leanback 库:提供了用于简化创建 Android TV 应用的 UI 模板。
  • Leanback Preferences 库:提供了与平台一致但可以根据应用主题自定义的偏好设置和设置屏幕。
  • Leanback Paging 库:为 ObjectAdapters 支持 AndroidX 分页模型,ObjectAdapters 通常与 Leanback 模板一起使用。
  • Leanback Tabs 库:支持 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。唯一的区别是您现在能够传入 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 Tabs 库

Leanback UI 工具包模板在浏览屏幕中提供侧边导航。如需在应用顶部横向添加一排标签页,您可以使用 Leanback Tabs。

将库依赖项添加到您的项目:

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 Tabs 库在其支持的主题以及焦点移动的处理方式上存在限制。

支持的主题

仅支持派生自 Theme.AppCompat 的主题。TabLayout 包含一个主题强制约束,该约束会阻止使用 Theme.AppCompat 的任何非后代主题。您也可以使用 Leanback UI 工具包的桥接主题。

焦点从标签页移至顶部

当布局高度大于屏幕高度并按下方向键向上按钮时,焦点会移回标签页,而不是停留在片段内并导航到其上方项(参见图 1)。为了解决此问题,片段内部的内容必须覆盖焦点搜索;例如,使用 RowsSupportFragmentBrowseSupportFragment 不能在标签页内使用,因为它有一个被覆盖的焦点搜索方法,该方法会阻止焦点移回标签页。

图 1. 方向键向上按钮将焦点移至标签页,而非前一项。