Il toolkit dell'interfaccia utente di Leanback fornisce alcune librerie specifiche per TV esclusive delle 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.
- Raccolta delle preferenze di Leanback: fornisce schermate di preferenze e impostazioni coerenti con la piattaforma, ma che possono essere personalizzate in base a un tema corrispondente alla tua app.
- Libreria Leanback Paging: supporta il modello di paging AndroidX per
ObjectAdapters
, comunemente utilizzato con i modelli di Leanback. - Raccolta di schede Leanback: supporta la navigazione a schede su Android TV.
Libreria di paging Leanback
Il 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 di paging Leanback, l'adattatore esposto è in genere un ObjectAdapter
, quindi 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"
A questo punto, segui la documentazione relativa alla pagina 3 utilizzando androidx.leanback.paging.PagingDataAdapter
anziché androidx.paging.PagingDataAdapter
. L'unica differenza è che ora puoi
trasmettere un modulo Presenter
o
PresenterSelector
.
Funziona ovunque in cui normalmente useresti un ObjectAdapter
, ad esempio 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);
Raccolta di schede Leanback
I modelli del toolkit dell'interfaccia utente di Leanback offrono la navigazione laterale nella schermata di esplorazione. Per aggiungere una riga di schede orizzontalmente nella parte superiore dell'app, puoi usare le schede Leanback.
Aggiungi la dipendenza dalla libreria al progetto:
implementation "androidx.leanback:leanback-tab:$version"
Quindi implementa le schede utilizzando LeanbackTabLayout
e LeanbackViewPager
seguendo la
guida ViewPager esistente. Tieni presente che
LeanbackViewPager
si basa su ViewPager
, non su ViewPager2
.
Ecco 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 relative ai temi che supporta e alla modalità di gestione del movimento del focus.
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 usare il tema del bridge anche
per il toolkit dell'interfaccia utente di Leanback.
Imposta lo stato attivo sul movimento dalle schede all'alto
Quando l'altezza del layout è superiore all'altezza dello schermo e premi il pulsante del D-pad in alto, il controllo torna alla scheda anziché rimanere all'interno del frammento e passare a un elemento al di sopra (vedi la figura 1). Per gestire questo problema, i contenuti all'interno del frammento devono sostituire la ricerca dello stato attivo; ad esempio, utilizza RowsSupportFragment
.
BrowseSupportFragment
non può essere utilizzato all'interno di una scheda in quanto ha un metodo di ricerca dello stato attivo sostituito che
impedisce lo stato attivo di tornare alla scheda.