AndroidX TV 媒體庫

大部分 AndroidX 程式庫都可以與 Android TV 搭配使用。您可以使用架構元件 (例如 ViewModel) 管理生命週期感知 UI 資料,並使用 Room 輕鬆使用本機 SQLite 資料庫,就像使用行動裝置一樣。不過,有些電視專用的程式庫支援 Android TV 專屬功能。這些程式庫包括:

  • Leanback 程式庫提供 UI 範本,可簡化建立 Android TV 應用程式的流程。
  • Leanback 偏好設定程式庫提供與平台一致的偏好設定和設定畫面,但您也可以根據應用程式來設定主題。
  • Leanback Paging 程式庫支援 ObjectAdapters 的 AndroidX 分頁模型,後者常與 Leanback 範本搭配使用。
  • Leanback 分頁程式庫支援在 Android TV 上使用分頁式導覽功能。

Leanback 分頁程式庫

Leanback 的 Paging 功能與 AndroidX Paging 3 程式庫相同,這個程式庫可簡化將分頁新增至 RecyclerView.Adapter 的程序。使用 Leanback 時,公開的轉接程式通常是 ObjectAdapter,因此 Leanback Paging 程式庫為 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 範本可在瀏覽體驗中提供側邊導覽功能,這項功能適用於許多應用程式。如果您需要分頁導覽 (通常是在應用程式上方水平顯示),可以改用 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 的橋接主題。

將焦點移至分頁頂端

當版面配置高度大於螢幕高度,並按下 D-Pad 向上按鈕時,控制項會移回分頁,而非停留在片段中,並前往上方的項目 (觀看影片)。如要處理這個問題,片段中的內容必須覆寫焦點搜尋。舉例來說,請使用 RowsSupportFragment 處理這個問題;BrowseSupportFragment 無法在分頁中使用,因為其有覆寫的焦點搜尋方法,導致焦點無法移回分頁。