Leanback UI 工具包程式庫

使用 Compose 打造更優質的應用程式
使用 Android TV OS 適用的 Jetpack Compose,以最少的程式碼建立美觀的 UI。

已淘汰的 Leanback UI 工具包提供一些專為 Android TV OS 開發的應用程式專用 TV 程式庫。這些程式庫包括:

  • Leanback 程式庫:提供 UI 範本,簡化 Android TV 應用程式的建立程序。
  • Leanback 偏好設定資料庫:提供與平台一致的偏好設定和設定畫面,但可設定主題來配合應用程式。
  • Leanback Paging 程式庫:支援 ObjectAdapters 的 AndroidX 分頁模型,這類模型通常與 Leanback 範本搭配使用。
  • Leanback Tabs 程式庫:支援 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 Tabs 程式庫

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 Tabs 程式庫支援的主題有限,處理焦點移動的方式也有限。

支援的主題

系統僅支援衍生自 Theme.AppCompat 的主題。TabLayout 包含主題強制執行限制,可防止使用 Theme.AppCompat 的任何非後代主題。您也可以使用橋接主題,取得 Leanback UI 工具包。

從分頁到頂端的焦點移動

如果版面配置高度大於螢幕高度,且您按下 D-pad 上按鈕,控制項會移回分頁,而不是留在片段內並導覽至上方項目 (請參閱圖 1)。如要解決這個問題,片段內的內容必須覆寫焦點搜尋,例如使用 RowsSupportFragmentBrowseSupportFragment 無法在分頁內使用,因為它覆寫了焦點搜尋方法,導致焦點無法移回分頁。

圖 1. D-Pad 向上按鈕會將焦點移至分頁,而非前一個項目。