Leanback UI ツールキット ライブラリ

Compose でより良いアプリを構築する
Android TV OS 用の Jetpack Compose を使用して、最小限のコードで美しい UI を作成します。

非推奨の Leanback UI ツールキットには、Android TV OS 用に開発されたアプリ専用の TV 固有のライブラリがいくつか用意されています。これらのライブラリには次のものがあります。

  • Leanback ライブラリ: Android TV アプリの作成を 簡素化する UI テンプレートを提供します。
  • Leanback Preferences ライブラリ: プラットフォームと一貫性があり、アプリに合わせてテーマを設定できる設定画面を提供します。
  • Leanback Paging ライブラリ: AndroidX ページング モデルをサポートします。これは、ObjectAdapters とともに Leanback テンプレートで一般的に使用されます。
  • Leanback Tabs ライブラリ: Android TV でのタブ付き ナビゲーションをサポートします。

Leanback Paging ライブラリ

Leanback UI ツールキット内のページングは、AndroidX Paging 3 ライブラリと同じように機能します。これにより、 RecyclerView.Adapter にページングを簡単に追加できます。 Leanback Paging ライブラリでは、公開されるアダプターは通常 ObjectAdapter であるため、ライブラリはObjectAdapterにページング サポートを追加します。

ページング アダプターをアプリに追加するには、まずプロジェクトにライブラリ依存関係を追加します。

implementation "androidx.leanback:leanback-paging:$version"

次に、 androidx.paging.PagingDataAdapter ではなく androidx.leanback.paging.PagingDataAdapter を使用して、 Paging 3 のドキュメントに沿って操作します。唯一の違いは、 Presenterまたは PresenterSelectorを渡せるようになったことです。 これは、 ListRow など、通常 ObjectAdapter を使用する場所であればどこでも機能します。

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 を使用してタブを実装します。 LeanbackViewPagerViewPager2 ではなく ViewPager に基づいていることに注意してください。

次に例を示します。

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 を参照)。この問題を処理するには、フラグメント内のコンテンツ でフォーカス検索をオーバーライドする必要があります。たとえば、 RowsSupportFragmentを使用します。 BrowseSupportFragment は、フォーカス検索メソッドがオーバーライドされているため、タブ内で使用できません。これにより、フォーカスがタブに戻るのを防ぎます。

図 1. D-pad の上ボタンを押すと、前の項目ではなくタブにフォーカスが移動します。