Library AndroidX TV

Sebagian besar library AndroidX dapat digunakan dengan Android TV. Anda dapat menggunakan Komponen Arsitektur seperti ViewModel untuk mengelola data UI berbasis siklus proses, dan Room agar lebih mudah bekerja dengan database SQLite lokal, sama seperti yang Anda lakukan untuk perangkat seluler. Namun, ada beberapa library khusus TV yang mendukung fungsi yang eksklusif untuk Android TV. Library ini mencakup:

  • Library Leanback menyediakan template UI yang menyederhanakan pembuatan aplikasi Android TV.
  • Library Leanback Preferences menyediakan layar preferensi dan setelan yang konsisten dengan platform, tetapi dapat diberi tema agar cocok dengan aplikasi Anda.
  • Library Leanback Paging mendukung model paging AndroidX untuk ObjectAdapters, yang biasa digunakan dengan template Leanback.
  • Library Leanback Tabs mendukung navigasi bertab di Android TV.

Library Paging Leanback

Paging untuk Leanback berfungsi sama dengan library Paging 3 AndroidX, yang menyederhanakan penambahan paging ke RecyclerView.Adapter. Dengan Leanback, adaptor yang diekspos biasanya merupakan ObjectAdapter, sehingga library Paging Leanback menambahkan dukungan paging ke ObjectAdapter.

Pertama, tambahkan library ke project Anda:

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

Kemudian, Anda dapat mengikuti dokumentasi Paging 3 menggunakan androidx.leanback.paging.PagingDataAdapter, bukan androidx.paging.PagingDataAdapter. Satu-satunya perbedaan adalah sekarang Anda dapat meneruskan Presenter atau PresenterSelector. Ini berfungsi di mana pun Anda biasanya menggunakan ObjectAdapter, seperti di 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);

Library Leanback Tabs

Template Leanback menyediakan navigasi samping dalam pengalaman penjelajahan, yang berfungsi dengan baik untuk banyak aplikasi. Jika memerlukan navigasi tab (biasanya ditampilkan secara horizontal di seluruh bagian atas aplikasi), Anda dapat menggunakan Leanback Tabs.

Tambahkan library ke project Anda:

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

Kemudian, terapkan tab menggunakan LeanbackTabLayout dan LeanbackViewPager dengan mengikuti panduan ViewPager yang sudah ada. Perhatikan bahwa LeanbackViewPager didasarkan pada ViewPager, bukan ViewPager2.

Contoh sederhananya terlihat seperti berikut:

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);

Batasan

Library Leanback Tabs memiliki batasan berikut.

Tema yang didukung

Hanya tema yang berasal dari Theme.AppCompat yang didukung. TabLayout berisi batasan penerapan tema, yang mencegah penggunaan tema non-turunan Theme.AppCompat. Anda juga dapat menggunakan tema jembatan untuk Leanback.

Fokuskan gerakan dari tab ke atas

Jika tinggi tata letak lebih besar dari tinggi layar dan Anda menekan tombol atas D-pad, kontrol akan bergerak kembali ke tab, bukan tetap berada di dalam fragmen dan menavigasi ke item di atasnya (lihat video). Untuk menangani masalah ini, konten di dalam fragmen harus mengganti penelusuran fokus. Misalnya, gunakan RowsSupportFragment untuk menangani masalah ini; BrowseSupportFragment tidak dapat digunakan di dalam tab karena memiliki metode penelusuran fokus yang diganti yang mencegah fokus berpindah kembali ke tab.