Bibliotecas de AndroidX TV

La mayoría de las bibliotecas de AndroidX se puede usar con Android TV. Puedes usar componentes de arquitectura, como ViewModel, para administrar datos de IU optimizados para ciclos de vida, y Room, para trabajar con facilidad con bases de datos SQLite locales de la misma manera que lo harías con dispositivos móviles. Sin embargo, hay algunas bibliotecas específicas para TV que admiten funciones exclusivas de Android TV. Entre estas bibliotecas, se incluyen las siguientes:

  • La biblioteca de Leanback proporciona plantillas de IU que simplifican la creación de apps para Android TV.
  • La biblioteca de Preferencias de Leanback proporciona pantallas de preferencias y de configuración que son coherentes con la plataforma, pero se puede aplicar un tema para que coincida con tu app.
  • La 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.
  • La biblioteca de Leanback Tabs admite la navegación con pestañas en Android TV.

Biblioteca de Paging de Leanback

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

Primero, agrega la biblioteca a tu proyecto:

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

Luego, puedes seguir 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 pestañas Leanback

Las plantillas Leanback proporcionan navegación lateral en la experiencia de navegación, que funciona bien para muchas apps. Si necesitas la navegación con pestañas (por lo general, se muestra horizontalmente en la parte superior de la app), puedes usar pestañas Leanback en su lugar.

Agrega 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.

Un ejemplo sencillo se ve de la siguiente manera:

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 Leanback tiene las siguientes limitaciones.

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 descendiente de Theme.AppCompat. También puedes usar el tema de puente para Leanback.

Enfocar el movimiento desde las pestañas hacia arriba

Cuando la altura del diseño es superior a la altura de la pantalla y presionas el botón hacia arriba del pad direccional, el control volverá a la pestaña en lugar de quedarse dentro del fragmento y navegar a un elemento sobre él (ver video). Para solucionar este problema, el contenido dentro del fragmento debe anular la búsqueda de enfoque. Por ejemplo, usa RowsSupportFragment para manejar este problema. 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.