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.