Das eingestellte Leanback UI-Toolkit bietet einige TV-spezifische Bibliotheken, die ausschließlich für Apps verfügbar sind, die für Android TV OS entwickelt wurden. Dazu gehören:
- Leanback-Bibliothek: Bietet UI-Vorlagen, die das Erstellen von Android TV-Apps vereinfachen.
- Leanback-Einstellungen: Diese Bibliothek bietet Einstellungsbildschirme, die mit der Plattform konsistent sind, aber an Ihre App angepasst werden können.
- Leanback Paging-Bibliothek: Unterstützt das AndroidX-Pagingmodell für
ObjectAdapters
, die häufig mit den Leanback-Vorlagen verwendet werden. - Leanback Tabs-Bibliothek: Unterstützt die Tab-Navigation auf Android TV.
Leanback-Paging-Bibliothek
Die Paginierung im Leanback-UI-Toolkit funktioniert genauso wie in der AndroidX-Bibliothek Paging 3, mit der sich die Paginierung in eine RecyclerView.Adapter
einfügen lässt.
Mit der Leanback Paging-Bibliothek ist der bereitgestellte Adapter in der Regel ein ObjectAdapter
. Die Bibliothek fügt ObjectAdapter
also die Unterstützung für das Paging hinzu.
Wenn Sie Ihrer App einen Paging-Adapter hinzufügen möchten, fügen Sie zuerst die Bibliotheksabhängigkeit zu Ihrem Projekt hinzu:
implementation "androidx.leanback:leanback-paging:$version"
Folgen Sie dann der Paging 3-Dokumentation und verwenden Sie androidx.leanback.paging.PagingDataAdapter
anstelle von androidx.paging.PagingDataAdapter
. Der einzige Unterschied besteht darin, dass Sie jetzt Presenter
oder PresenterSelector
übergeben können.
Das funktioniert überall dort, wo Sie normalerweise ein ObjectAdapter
verwenden würden, z. B. in einem 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-Bibliothek
Die Vorlagen des Leanback UI-Toolkits bieten eine Seitennavigation auf dem Browsing-Bildschirm. Wenn Sie stattdessen eine horizontale Zeile mit Tabs oben in der App hinzufügen möchten, können Sie Leanback-Tabs verwenden.
Fügen Sie Ihrem Projekt die Bibliotheksabhängigkeit hinzu:
implementation "androidx.leanback:leanback-tab:$version"
Implementieren Sie dann Tabs mit LeanbackTabLayout
und LeanbackViewPager
. Folgen Sie dazu der vorhandenen ViewPager-Anleitung. LeanbackViewPager
basiert auf ViewPager
und nicht auf ViewPager2
.
Hier ein Beispiel:
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);
Beschränkungen
Die Leanback Tabs-Bibliothek hat Einschränkungen hinsichtlich der unterstützten Designs und der Art und Weise, wie die Fokusbewegung gehandhabt wird.
Unterstützte Themen
Es werden nur Designs unterstützt, die von Theme.AppCompat
abgeleitet sind. TabLayout
enthält eine Einschränkung für die Erzwingung von Designs, die verhindert, dass ein anderes Design als ein untergeordnetes Design von Theme.AppCompat
verwendet wird. Sie können das Bridge-Design auch für das Leanback UI-Toolkit verwenden.
Fokusbewegung von Tabs nach oben
Wenn die Layout-Höhe größer als die Bildschirmhöhe ist und Sie die Aufwärtstaste des Steuerkreuzes drücken, wird die Steuerung wieder auf den Tab verschoben, anstatt im Fragment zu bleiben und zu einem Element darüber zu wechseln (siehe Abbildung 1). Um dieses Problem zu beheben, muss die Fokus-Suche durch Inhalte im Fragment überschrieben werden. Verwenden Sie dazu beispielsweise RowsSupportFragment
.
BrowseSupportFragment
kann nicht in einem Tab verwendet werden, da die Fokus-Suchmethode überschrieben wurde und der Fokus nicht zum Tab zurückkehren kann.