Bibliotecas del kit de herramientas de la IU de Leanback

El kit de herramientas de la IU de Leanback proporciona algunas bibliotecas específicas para TV que son 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 preferencias y pantallas de configuración que son coherentes con la plataforma, pero pueden tener un tema que coincida con tu app.
  • Biblioteca de Leanback Paging: Admite el modelo de paginación de AndroidX para ObjectAdapters, que se usan comúnmente con las plantillas de Leanback.
  • Biblioteca de Leanback Tabs: Admite la navegación con pestañas en Android TV.

Biblioteca de Paging de Leanback

Paging dentro del kit de herramientas de la IU de Leanback funciona igual que la biblioteca 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 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 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 pestañas Leanback

Las plantillas del kit de herramientas de la IU de Leanback proporcionan 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 pestañas Leanback en su lugar.

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

Temas compatibles

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

Enfocar el movimiento de las pestañas a la parte superior

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

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