El kit de herramientas de interfaz de usuario de Leanback ofrece algunas bibliotecas específicas de TV exclusivas para Apps desarrolladas para el SO Android TV. Estas bibliotecas incluyen lo siguiente:
- Biblioteca Leanback: Proporciona plantillas de IU que simplifica la creación de apps para Android TV.
- Preferencias de Leanback biblioteca: proporciona pantallas de preferencias y configuración que son coherentes con la plataforma, pero puedes usar un tema para que coincida con tu app.
- Biblioteca de Leanback Paging: Admite lo siguiente:
El modelo de paginación de AndroidX para
ObjectAdapters
, que se usa comúnmente con el Plantillas Leanback. - Biblioteca Leanback Tabs: admite pestañas la navegación GPS 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 en AndroidX.
Paging 3, que
simplifica agregar paginación a una
RecyclerView.Adapter
Con la biblioteca de Paging Leanback, el adaptador que se expone suele ser un
ObjectAdapter
en su lugar, 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 el
Documentación de Paging 3 con
androidx.leanback.paging.PagingDataAdapter
en lugar de
androidx.paging.PagingDataAdapter
La única diferencia es que ahora puedes
para pasar un Presenter
o
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 IU de Leanback ofrecen navegación lateral en el pantalla de navegación: Cómo agregar una fila de pestañas horizontalmente en la parte superior de la aplicación, puedes usar Leanback Tabs 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
. Para ello, haz lo siguiente:
siguiendo el plan de
Guía de ViewPager. 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 cómo el enfoque y movimiento.
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 cualquier tema no descendiente
de Theme.AppCompat
. También puedes usar el tema puente para
Kit de herramientas de IU de Leanback.
Enfocar movimiento de las pestañas a la parte superior
Cuando la altura de diseño es mayor que la de la pantalla y presionas el pad direccional
botón Arriba, el control vuelve a la pestaña en lugar de permanecer dentro del fragmento
y navegar hasta un elemento que se encuentra sobre él (consulta la figura 1). Para resolver este problema, el contenido
dentro del fragmento debe anular la búsqueda de enfoque; por ejemplo, usa
RowsSupportFragment
BrowseSupportFragment
no se puede utilizar 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.