El kit de herramientas de IU de Leanback, que dejó de estar disponible, proporciona algunas bibliotecas específicas para TV exclusivas de las apps desarrolladas para el SO Android TV. Estas bibliotecas incluyen lo siguiente:
- Biblioteca de 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 diseñar para que coincidan con tu app.
- Biblioteca de Paging de Leanback: Admite el
modelo de paginación de AndroidX para
ObjectAdapters, que se usan de uso frecuente con las plantillas de Leanback. - Biblioteca de pestañas de Leanback: Admite la navegación con pestañas en Android TV.
Biblioteca de Paging de Leanback
La paginación dentro del kit de herramientas de IU de Leanback funciona igual 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
en su lugar, 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
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 pestañas de Leanback
Las plantillas del kit de herramientas de 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 las pestañas de Leanback.
Agrega la dependencia de la biblioteca a tu proyecto:
implementation "androidx.leanback:leanback-tab:$version"
Luego, implementa las 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 cómo se maneja el movimiento del enfoque.
Temas admitidos
Solo se admiten los temas derivados de Theme.AppCompat. TabLayout
contiene una restricción de aplicación de tema, que impide que se use cualquier tema no descendiente de Theme.AppCompat. También puedes usar el tema de puente para el kit de herramientas de IU de Leanback.
Movimiento del enfoque de las pestañas a la parte superior
Cuando la altura del diseño es mayor que la altura de la pantalla y presionas el botón 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á arriba (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
impide que el enfoque vuelva a la pestaña.