O kit de ferramentas de interface do usuário Leanback descontinuado oferece algumas bibliotecas específicas para TV exclusivas de apps desenvolvidos para o Android TV OS. Essas bibliotecas incluem o seguinte:
- Biblioteca Leanback: oferece modelos de interface do usuário que simplificam a criação de apps para Android TV.
- Biblioteca Leanback Preferences: oferece telas de preferências e configurações consistentes com a plataforma, mas que podem ser temáticas para corresponder ao seu app.
- Biblioteca Leanback Paging: oferece suporte ao
modelo de paginação do AndroidX para
ObjectAdapters, que são usados com frequência com os modelos Leanback. - Biblioteca Leanback Tabs: oferece suporte à navegação com guias no Android TV.
Biblioteca de paginação Leanback
A paginação no kit de ferramentas de interface do usuário 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 é normalmente um
ObjectAdapter
. Portanto, a biblioteca adiciona suporte à paginação ao ObjectAdapter.
Para adicionar um adaptador de paginação ao seu app, primeiro adicione a dependência da biblioteca ao seu projeto:
implementation "androidx.leanback:leanback-paging:$version"
Em seguida, siga a
documentação do Paging 3 usando
androidx.leanback.paging.PagingDataAdapter em vez de
androidx.paging.PagingDataAdapter. A única diferença é que agora você pode transmitir um PresenterouPresenterSelector.
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 Leanback Tabs
Os modelos do kit de ferramentas de interface do usuário Leanback oferecem navegação lateral na tela de navegação. Para adicionar uma linha de guias horizontalmente na parte de cima do app, use as guias Leanback.
Adicione a dependência da biblioteca ao seu projeto:
implementation "androidx.leanback:leanback-tab:$version"
Em seguida, implemente guias usando LeanbackTabLayout e LeanbackViewPager seguindo o guia do ViewPager. Observe que
LeanbackViewPager é baseado em ViewPager, não em ViewPager2.
Veja um exemplo abaixo.
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 que oferece suporte e na forma como o movimento do foco é processado.
Temas com suporte
Há suporte apenas para temas derivados de Theme.AppCompat. TabLayout
contém uma restrição de aplicação de tema, que impede o uso de qualquer tema não descendente de Theme.AppCompat. Você também pode usar o tema de ponte para o kit de ferramentas de interface do usuário Leanback.
Movimento do foco das guias para a parte de cima
Quando a altura do layout é maior que a altura da tela e você pressiona o botão para cima do botão direcional, o controle volta para a guia em vez de permanecer dentro do fragmento e navegar para um item acima dele (consulte a Figura 1). Para resolver 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.