Wycofany zestaw narzędzi Leanback UI zawiera biblioteki przeznaczone specjalnie na telewizory, które są dostępne tylko w aplikacjach opracowanych na Androida TV. Te biblioteki obejmują:
- Biblioteka Leanback: udostępnia szablony interfejsu, które upraszczają tworzenie aplikacji na Androida TV.
- Leanback Preferences library: udostępnia ekrany ustawień i preferencji, które są zgodne z platformą, ale można je dostosować do motywu aplikacji.
- Biblioteka Leanback Paging: obsługuje model stronicowania AndroidX w przypadku
ObjectAdapters
, które są często używane z szablonami Leanback. - Biblioteka Leanback Tabs: obsługuje nawigację na kartach na Androidzie TV.
Biblioteka stronicowania Leanback
Stronicowanie w zestawie narzędzi interfejsu Leanback działa tak samo jak w bibliotece AndroidX Paging 3, która upraszcza dodawanie stronicowania do RecyclerView.Adapter
.
W przypadku biblioteki Leanback Paging udostępniany adapter jest zwykle typu ObjectAdapter
, więc biblioteka dodaje obsługę stronicowania do ObjectAdapter
.
Aby dodać do aplikacji adapter stronicowania, najpierw dodaj zależność biblioteki do projektu:
implementation "androidx.leanback:leanback-paging:$version"
Następnie postępuj zgodnie z dokumentacją dotyczącą stronicowania 3, używając znaku
androidx.leanback.paging.PagingDataAdapter
zamiast znaku
androidx.paging.PagingDataAdapter
. Jedyna różnica polega na tym, że możesz teraz przekazywać wartość Presenter
lub PresenterSelector
.
Ten skrót działa wszędzie tam, gdzie zwykle używasz znaku ObjectAdapter
, np. w 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);
Biblioteka kart Leanback
Szablony pakietu narzędzi Leanback UI zapewniają nawigację boczną na ekranie przeglądania. Aby dodać wiersz kart w poziomie u góry aplikacji, możesz zamiast tego użyć kart Leanback.
Dodaj do projektu zależność biblioteki:
implementation "androidx.leanback:leanback-tab:$version"
Następnie zaimplementuj karty za pomocą elementów LeanbackTabLayout
i LeanbackViewPager
, postępując zgodnie z przewodnikiem po ViewPager. Pamiętaj, że LeanbackViewPager
zależy od ViewPager
, a nie od ViewPager2
.
Oto przykład:
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);
Ograniczenia
Biblioteka Leanback Tabs ma ograniczenia dotyczące obsługiwanych motywów i sposobu obsługi przenoszenia fokusu.
Obsługiwane motywy
Obsługiwane są tylko motywy pochodzące z Theme.AppCompat
. TabLayout
zawiera ograniczenie dotyczące wymuszania motywu, które uniemożliwia używanie dowolnego motywu niebędącego elementem podrzędnym motywu Theme.AppCompat
. Możesz też użyć motywu bridge w zestawie narzędzi Leanback UI.
Przenoszenie zaznaczenia z kart na górę
Gdy wysokość układu jest większa niż wysokość ekranu i naciśniesz przycisk D-pada w górę, fokus wróci do karty zamiast pozostać w fragmencie i przejść do elementu powyżej (patrz rysunek 1). Aby rozwiązać ten problem, treści w fragmencie muszą zastępować wyszukiwanie fokusu. Możesz na przykład użyć RowsSupportFragment
.
BrowseSupportFragment
nie można używać w karcie, ponieważ ma on zastąpioną metodę wyszukiwania zaznaczenia, która uniemożliwia powrót zaznaczenia do karty.