大多數 AndroidX 程式庫都可與 Android TV 搭配使用。您可以使用 ViewModel
等架構元件來管理生命週期感知 UI 資料,並使用 Room
輕鬆使用本機 SQLite 資料庫,做法與使用行動裝置相同;然而,有些電視專用的程式庫仍支援 Android TV 專屬的功能。這些程式庫包括:
- Leanback 程式庫提供 UI 範本,可簡化 Android TV 應用程式的建立流程。
- Leanback Preferences 程式庫提供與平台相符的偏好設定和設定畫面,但可依據應用程式主題設定。
- Leanback Paging 程式庫支援
ObjectAdapters
的 AndroidX 分頁模型,這類模型常與 Leanback 範本搭配使用。 - Leanback Tabs 程式庫支援 Android TV 的分頁瀏覽功能。
Leanback Paging 程式庫
Leanback 的分頁機制與 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
。唯一的差別在於,您現在可以傳入 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 Tabs 程式庫
Leanback 範本可在瀏覽體驗中提供側邊導覽功能,適用於許多應用程式。如果需要分頁導覽 (通常在應用程式上方水平顯示),請改用 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 Tabs 程式庫具有下列限制。
支援的主題
僅支援衍生自 Theme.AppCompat
的主題。TabLayout
包含主題強制執行限制,可防止使用任何 Theme.AppCompat
的非子主題。您也可以使用 Leanback 的橋接設定主題。
將焦點從分頁移至頂端
如果版面配置高度大於螢幕高度,且按下 D-Pad 按鈕,控制項會移回該分頁,而不是停留在片段內並導覽至其上方的項目 (觀看影片)。為解決這個問題,片段中的內容必須覆寫焦點搜尋。舉例來說,使用 RowsSupportFragment
即可處理這個問題;BrowseSupportFragment
無法在分頁中使用,因為其具有覆寫的聚焦搜尋方法,導致焦點無法移回分頁。