Das Leanback-UI-Toolkit bietet einige TV-spezifische Bibliotheken, die nur für Apps verfügbar sind, die für Android TV OS entwickelt wurden. Zu diesen Bibliotheken gehören:
- Leanback-Bibliothek: stellt UI-Vorlagen bereit, die das Erstellen von Android TV-Apps vereinfachen.
- Leanback-Einstellungen-Bibliothek: Hier findest du Einstellungen und Bildschirme, die mit der Plattform konsistent sind, aber an deine App angepasst werden können.
- Leanback-Auslagerungsbibliothek: unterstützt das AndroidX-Auslagerungsmodell für
ObjectAdapters
, das häufig mit den Leanback-Vorlagen verwendet wird. - Leanback Tabs-Bibliothek: unterstützt die Navigation mit Tabs unter Android TV.
Leanback-Paging-Bibliothek
Das Paging im Leanback-UI-Toolkit funktioniert genauso wie die AndroidX-Paging 3-Bibliothek, die das Hinzufügen von Paging zu einer RecyclerView.Adapter
vereinfacht.
Bei der Leanback-Auslagerungsbibliothek ist der bereitgestellte Adapter in der Regel stattdessen ein ObjectAdapter
. Daher unterstützt die Bibliothek die Paging-Unterstützung für ObjectAdapter
.
Um Ihrer App einen Paging-Adapter hinzuzufügen, fügen Sie zuerst die Bibliotheksabhängigkeit zu Ihrem Projekt hinzu:
implementation "androidx.leanback:leanback-paging:$version"
Folgen Sie dann der Dokumentation zu Paging 3 und verwenden Sie androidx.leanback.paging.PagingDataAdapter
anstelle von androidx.paging.PagingDataAdapter
. Der einzige Unterschied besteht darin, dass Sie jetzt ein Presenter
- oder PresenterSelector
-Objekt übergeben können.
Das funktioniert überall, wo Sie normalerweise ein ObjectAdapter
verwenden, z. B. in 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 ermöglichen eine seitliche Navigation im Browserbildschirm. Um eine Reihe von Tabs horizontal oben in der App hinzuzufügen, kannst du stattdessen 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 dem bestehenden ViewPager-Leitfaden. Hinweis: LeanbackViewPager
basiert auf ViewPager
, 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);
Einschränkungen
Die Leanback-Tabs-Bibliothek hat Einschränkungen hinsichtlich der unterstützten Designs und der Art und Weise, wie Fokusbewegungen gehandhabt werden.
Unterstützte Designs
Es werden nur aus Theme.AppCompat
abgeleitete Themen unterstützt. TabLayout
enthält eine Einschränkung für die Erzwingung von Designs, die verhindert, dass beliebige nicht untergeordnete Designs von Theme.AppCompat
verwendet werden. Sie können das Brückenthema auch für das
Leanback-UI-Toolkit verwenden.
Bewegung von Tabs nach oben fokussieren
Wenn die Layouthöhe größer als die Bildschirmhöhe ist und Sie die Schaltfläche zum Aufwärtspfeil auf dem Steuerkreuz drücken, wird die Steuerung zurück zum Tab verschoben, anstatt innerhalb des Fragments zu bleiben und zu einem übergeordneten Element zu navigieren (siehe Abbildung 1). Zur Behebung dieses Problems muss die Fokussuche durch Inhalte innerhalb des Fragments überschrieben werden. Verwenden Sie beispielsweise RowsSupportFragment
.
BrowseSupportFragment
kann nicht in einem Tab verwendet werden, da es eine überschriebene Fokussuchmethode hat, die verhindert, dass der Fokus zurück zum Tab verschoben wird.