Leanback-UI-Toolkit-Bibliotheken

Besser lernen mit der Funktion „Schreiben“
Mit Jetpack Compose für Android TV OS lassen sich mit nur minimalem Code ansprechende UIs erstellen.

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.

Abbildung 1. Die Schaltfläche „Nach oben“ des Steuerkreuzes verschiebt den Fokus auf einen Tab statt auf das vorherige Element.