Bibliotecas de ferramentas de interface do Leanback

Criar da melhor forma com o Compose
Crie interfaces bonitas com o mínimo de código usando o Jetpack Compose para Android TV OS.

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

  • Biblioteca Leanback: oferece modelos de interface que simplificam a criação de apps para Android TV.
  • Biblioteca Leanback Preferences: oferece preferências e telas de configurações consistentes com a plataforma, mas que podem ser temáticas para corresponder ao app.
  • Biblioteca Leanback Paging: oferece suporte ao modelo de paginação do AndroidX para ObjectAdapters, que são usados com frequência nos modelos Leanback.
  • Biblioteca Leanback Tabs: oferece suporte à navegação em guias no Android TV.

Biblioteca de paginação do Leanback

A paginação no kit de ferramentas Leanback UI 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 Paging do Leanback, o adaptador exposto geralmente é um ObjectAdapter em vez disso. Assim, 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 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 Presenter ou um 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 Leanback

Os modelos do kit de ferramentas Leanback UI 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 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. 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 de guias do Leanback tem limitações nos temas que ela oferece suporte e na forma como o movimento do foco é processado.

Temas compatíveis

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 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 D-pad, o controle volta para a guia em vez de ficar 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 em uma guia porque tem um método de pesquisa de foco substituído que impede que o foco volte para a guia.

Figura 1. O botão para cima do D-pad move o foco para a guia em vez do item anterior.