O kit de ferramentas de interface do Leanback oferece algumas bibliotecas específicas de TV exclusivas para apps desenvolvidos para o SO do Android TV. Essas bibliotecas incluem o seguinte:
- Biblioteca Leanback: oferece modelos de interface que simplificam a criação de apps para Android TV.
- Biblioteca de Preferências de Leanback: oferece telas de preferências e configurações consistentes com a plataforma, mas que podem ter um tema para combinar com seu app.
- Biblioteca Leanback Paging: oferece suporte ao
modelo de paginação do AndroidX para
ObjectAdapters
, que são normalmente usados com os modelos de Leanback. - Biblioteca Leanback Tabs: oferece suporte à navegação com guias no Android TV.
Biblioteca Paging do Leanback
A paginação no kit de ferramentas de interface do Leanback funciona da mesma forma que a biblioteca Paging 3 do AndroidX, que
simplifica a adição de paginação a um
RecyclerView.Adapter
.
Com a biblioteca Leanback Paging, o adaptador exposto geralmente é um
ObjectAdapter
,
então, a biblioteca adiciona suporte à paginação para ObjectAdapter
.
Para adicionar um adaptador de paginação ao app, primeiro adicione a dependência da biblioteca ao projeto:
implementation "androidx.leanback:leanback-paging:$version"
Em seguida, siga a
documentação da Paging 3 usando
androidx.leanback.paging.PagingDataAdapter
em vez de
androidx.paging.PagingDataAdapter
. A única diferença é que agora você pode
transmitir um Presenter
ou
PresenterSelector
.
Isso funciona em qualquer lugar em que você normalmente usaria um ObjectAdapter
, como em um
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);
Biblioteca de guias do YouTube TV
Os modelos do kit de ferramentas de interface do Leanback oferecem navegação lateral na tela de navegação. Para adicionar uma linha de guias horizontalmente na parte de cima do app, você pode usar as guias do Leanback.
Adicione a dependência da biblioteca ao seu projeto:
implementation "androidx.leanback:leanback-tab:$version"
Em seguida, implemente as guias usando LeanbackTabLayout
e LeanbackViewPager
seguindo o
guia do ViewPager. Observe que
LeanbackViewPager
é baseado em ViewPager
, não em ViewPager2
.
Confira um exemplo:
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);
Limitações
A biblioteca Leanback Tabs tem limitações nos temas com suporte e na forma como o movimento de foco é processado.
Temas compatíveis
Somente temas derivados de Theme.AppCompat
são compatíveis. TabLayout
contém uma restrição de aplicação de tema, que impede que qualquer tema não descendente
de Theme.AppCompat
seja usado. Você também pode usar o tema de ponte para o
kit de ferramentas de interface de Leanback.
Focar o movimento das guias para o topo
Quando a altura do layout é maior que a altura da tela e você pressiona o botão direcional para cima, o controle volta para a guia em vez de permanecer dentro do fragmento e navegar até um item acima dele (consulte a Figura 1). Para lidar com esse problema, o conteúdo
dentro do fragmento precisa substituir a pesquisa de foco. Por exemplo, use
RowsSupportFragment
.
BrowseSupportFragment
não pode ser usado dentro de uma guia porque tem um método de pesquisa de foco substituído que
impede que o foco volte para a guia.