Il toolkit per la UI di Leanback fornisce alcune librerie specifiche per la TV esclusive per le app sviluppate per il sistema operativo Android TV. Queste librerie includono:
- Libreria Leanback: offre modelli di UI che semplificano la creazione di app Android TV.
- Libreria delle preferenze di Leanback: fornisce schermate di preferenze e impostazioni coerenti con la piattaforma, ma che possono essere tematizzate in base alla tua app.
- Libreria Leanback Paging: supporta il modello di paging AndroidX per
ObjectAdapters
, abitualmente utilizzato con i modelli Leanback. - Libreria Leanback Tabs: supporta la navigazione a schede su Android TV.
Libreria di paging Leanback
La paging all'interno del toolkit dell'interfaccia utente di Leanback funziona come la libreria
Paging 3 di AndroidX, che
semplifica l'aggiunta del paging a una
RecyclerView.Adapter
.
Con la libreria Leanback Paging, l'adattatore esposto è in genere un
ObjectAdapter
, pertanto la libreria aggiunge il supporto del paging a ObjectAdapter
.
Per aggiungere un adattatore di paging alla tua app, aggiungi prima la dipendenza della libreria al 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 passare in un elemento Presenter
o PresenterSelector
.
Funziona ovunque tu voglia normalmente usare 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 dell'interfaccia utente di Leanback offrono una barra di navigazione laterale nella schermata di navigazione. Per aggiungere una riga di schede in orizzontale nella parte superiore dell'app, puoi usare 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 per i temi che supporta e per la gestione dello spostamento di messa a fuoco.
Temi supportati
Sono supportati solo i temi derivati da Theme.AppCompat
. TabLayout
contiene un vincolo di applicazione forzata del tema, che impedisce l'utilizzo di qualsiasi tema non discendente
di Theme.AppCompat
. Puoi anche usare il tema ponte
per il toolkit Leanback UI.
Imposta lo stato attivo sul movimento dalle schede all'alto
Quando l'altezza del layout è superiore all'altezza dello schermo e premi il pulsante D-pad in alto, il controllo torna alla scheda invece di rimanere all'interno del frammento e passare a un elemento al di sopra (vedi figura 1). Per gestire questo problema, i contenuti all'interno del frammento devono sostituire la ricerca attiva; ad esempio, utilizza RowsSupportFragment
.
BrowseSupportFragment
non può essere utilizzato all'interno di una scheda perché ha un metodo di ricerca dello stato attivo con override che impedisce all'elemento attivo di tornare alla scheda.