Bibliotecas de ferramentas de interface do Leanback

O kit de ferramentas de interface Leanback oferece algumas bibliotecas específicas de TV exclusivas de apps desenvolvidos para o SO Android TV. Essas bibliotecas incluem o seguinte:

  • Biblioteca Leanback: fornece modelos de interface que simplificam a criação de apps para Android TV.
  • Biblioteca Leanback Preferences: fornece telas de preferências e configurações que são consistentes com a plataforma, mas podem ter um tema que corresponda ao seu app.
  • Biblioteca Leanback Paging: oferece suporte ao modelo de paginação do AndroidX para ObjectAdapters, que são comumente usados com os modelos de Leanback.
  • Biblioteca Leanback Tabs: oferece suporte à navegação por guias no Android TV.

Biblioteca Leanback Paging

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 uma RecyclerView.Adapter. Com a biblioteca Leanback Paging, o adaptador exposto normalmente é um ObjectAdapter. Portanto, a biblioteca adiciona suporte à paginação para ObjectAdapter.

Para adicionar um adaptador de paginação ao seu aplicativo, 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 usa 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 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 guias do Leanback.

Adicione a dependência da biblioteca ao projeto:

implementation "androidx.leanback:leanback-tab:$version"

Em seguida, implemente guias usando LeanbackTabLayout e LeanbackViewPager seguindo o guia do ViewPager já existente. 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 que oferece suporte e na forma como o movimento de foco é processado.

Temas compatíveis

Somente temas derivados de Theme.AppCompat são suportados. TabLayout contém uma restrição de aplicação de tema, que impede que qualquer tema não descendente de Theme.AppCompat seja usado. Também é possível usar o tema de ponte para o kit de ferramentas de interface do 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 para um item acima dele (confira 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.

Figura 1. Botão direcional para cima move o foco para a guia em vez do item anterior.