Il toolkit UI Leanback ritirato fornisce alcune librerie specifiche per la TV esclusive per le app sviluppate per il sistema operativo Android TV. Queste librerie includono:
- Libreria Leanback: fornisce modelli di UI che semplificano la creazione di app per Android TV.
- Libreria delle preferenze Leanback: fornisce schermate di preferenze e impostazioni coerenti con la piattaforma, ma può essere personalizzata con temi in modo che corrisponda alla tua app.
- Libreria Leanback Paging: supporta il modello di paginazione AndroidX per
ObjectAdapters
, che vengono comunemente utilizzati con i modelli Leanback. - Libreria Leanback Tabs: supporta la navigazione a schede su Android TV.
Libreria di paginazione Leanback
La paginazione all'interno del toolkit UI Leanback funziona come la libreria AndroidX
Paging 3, che
semplifica l'aggiunta della paginazione a un
RecyclerView.Adapter
.
Con la libreria Leanback Paging, l'adattatore esposto è in genere un
ObjectAdapter
e non un, quindi la libreria aggiunge il supporto della paginazione a ObjectAdapter
.
Per aggiungere un adattatore di paginazione alla tua app, aggiungi prima la dipendenza della libreria al tuo progetto:
implementation "androidx.leanback:leanback-paging:$version"
Poi segui la
documentazione di Paging 3 utilizzando
androidx.leanback.paging.PagingDataAdapter
anziché
androidx.paging.PagingDataAdapter
. L'unica differenza è che ora puoi
inserire un Presenter
o
un PresenterSelector
.
Funziona ovunque utilizzeresti normalmente un ObjectAdapter
, ad esempio in un
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);
Libreria Leanback Tabs
I modelli del toolkit UI Leanback forniscono la navigazione laterale nella schermata di navigazione. Per aggiungere una riga di schede orizzontalmente nella parte superiore dell'app, puoi utilizzare invece le schede Leanback.
Aggiungi la dipendenza della libreria al tuo progetto:
implementation "androidx.leanback:leanback-tab:$version"
Poi implementa le schede utilizzando LeanbackTabLayout
e LeanbackViewPager
seguendo la guida di ViewPager esistente. Tieni presente che
LeanbackViewPager
si basa su ViewPager
, non su ViewPager2
.
Di seguito è riportato un esempio:
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);
Limitazioni
La libreria Leanback Tabs presenta limitazioni nei temi supportati e nella gestione dello spostamento del focus.
Temi supportati
Sono supportati solo i temi derivati da Theme.AppCompat
. TabLayout
contiene un vincolo di applicazione del tema, che impedisce l'utilizzo di qualsiasi tema non discendente
di Theme.AppCompat
. Puoi anche utilizzare il tema bridge per il toolkit UI Leanback.
Spostamento dello stato attivo dalle schede alla parte superiore
Quando l'altezza del layout è maggiore dell'altezza dello schermo e premi il pulsante
su del D-pad, il controllo torna alla scheda anziché rimanere all'interno del frammento
e passare a un elemento sopra (vedi figura 1). Per gestire questo problema, i contenuti all'interno del frammento devono ignorare la ricerca della messa a fuoco; ad esempio, utilizza RowsSupportFragment
.
BrowseSupportFragment
non può essere utilizzato all'interno di una scheda perché ha un metodo di ricerca dello stato attivo di selezione sostituito che
impedisce allo stato attivo di selezione di tornare alla scheda.