Bibliotecas del kit de herramientas de la IU de Leanback

Crea mejores apps con Compose
Crea IU atractivas con la menor cantidad de código posible usando Jetpack Compose para el SO de Android TV.

El kit de herramientas de IU de Leanback, que dejó de estar disponible, proporciona algunas bibliotecas específicas para TVs exclusivas de las apps desarrolladas para el SO de 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 Preferencias de Leanback: Proporciona pantallas de preferencias y configuración que son coherentes con la plataforma, pero que se pueden personalizar 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 de pestañas de Leanback: Admite la navegación con pestañas en Android TV.

Biblioteca de paginación de 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, lo 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 con la paginación a ObjectAdapter.

Para agregar un adaptador de paginación a tu app, primero agrega la dependencia de la 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 donde 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 proporcionan navegación lateral en la pantalla de exploración. Para agregar una fila de pestañas horizontalmente en la parte superior de la app, puedes usar pestañas de Leanback.

Agrega la dependencia de la 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 pestañas de Leanback tiene limitaciones en los temas que admite y en la forma en que se maneja el movimiento del enfoque.

Temas compatibles

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

Movimiento del enfoque desde las pestañas hacia la parte superior

Cuando la altura del 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 se encuentra arriba (consulta la figura 1). Para controlar 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 impide que el enfoque vuelva a la pestaña.

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