Bibliotecas del kit de herramientas de la IU de Leanback

Compila mejor con Compose
Crea IU atractivas con muy poco código usando Jetpack Compose para el SO Android TV.

El kit de herramientas de la IU de Leanback proporciona algunas bibliotecas específicas para TV exclusivas de las apps desarrolladas para el SO Android TV. Estas bibliotecas incluyen lo siguiente:

  • Biblioteca Leanback: Proporciona plantillas de IU que simplifican la creación de apps para Android TV.
  • Biblioteca de Leanback Preferences: Proporciona pantallas de preferencias y configuración que son coherentes con la plataforma, pero que se pueden aplicar a un tema para que coincidan con tu app.
  • Biblioteca de paginación de Leanback: Admite el modelo de paginación de AndroidX para ObjectAdapters, que se usan comúnmente con las plantillas de Leanback.
  • Biblioteca Leanback Tabs: admite la navegación con pestañas en Android TV.

Biblioteca de paginación Leanback

La paginación dentro del kit de herramientas de la IU de Leanback funciona de la misma manera que la biblioteca de Paging 3 de AndroidX, que simplifica la adición de paginación a un RecyclerView.Adapter. Con la biblioteca de Paging de Leanback, el adaptador que se expone suele ser un ObjectAdapter, por lo que la biblioteca agrega compatibilidad de paginación a ObjectAdapter.

Para agregar un adaptador de paginación a tu app, primero agrega la dependencia de biblioteca a tu proyecto:

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

Luego, sigue la documentación de Paging 3 con androidx.leanback.paging.PagingDataAdapter en lugar de androidx.paging.PagingDataAdapter. La única diferencia es que ahora puedes pasar un Presenter o un PresenterSelector. Esto funciona en cualquier lugar en el que normalmente usarías un ObjectAdapter, como en un 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 Leanback Tabs

Las plantillas del kit de herramientas de la IU de Leanback ofrecen navegación lateral en la pantalla de navegación. Para agregar una fila de pestañas horizontalmente en la parte superior de la app, puedes usar las pestañas Leanback.

Agrega la dependencia de biblioteca a tu proyecto:

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

Luego, implementa pestañas con LeanbackTabLayout y LeanbackViewPager siguiendo la guía de ViewPager existente. Ten en cuenta que LeanbackViewPager se basa en ViewPager, no en ViewPager2.

A continuación, se muestra un ejemplo:

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);

Limitaciones

La biblioteca de Leanback Tabs tiene limitaciones en los temas que admite y en la manera en que se controla el movimiento del foco.

Temas compatibles

Solo se admiten los temas que derivan de Theme.AppCompat. TabLayout contiene una restricción de aplicación de temas, que evita que se use cualquier tema no descendiente de Theme.AppCompat. También puedes usar el tema puente para el kit de herramientas de la IU de Leanback.

Enfocar movimiento de las pestañas a la parte superior

Cuando la altura de diseño es mayor que la altura de la pantalla y presionas el botón hacia arriba del pad direccional, el control vuelve a la pestaña en lugar de permanecer dentro del fragmento y navegar a un elemento que esté por encima de ella (consulta la figura 1). Para solucionar este problema, el contenido dentro del fragmento debe anular la búsqueda de enfoque. Por ejemplo, usa RowsSupportFragment. BrowseSupportFragment no se puede usar dentro de una pestaña, ya que tiene un método de búsqueda de enfoque anulado que evita que el enfoque regrese a la pestaña.

Figura 1: El botón hacia arriba del pad direccional mueve el enfoque a la pestaña en lugar del elemento anterior.