Navegación en la TV

Los dispositivos de TV ofrecen una cantidad limitada de controles de navegación para las apps. Crear un esquema de navegación eficaz para tu app para TV depende de comprender estos controles limitados y las limitaciones de los usuarios al operar tu app. A medida que compiles tu app para Android para TV, presta especial atención a la forma en que el usuario navega con los botones del control remoto en lugar de una pantalla táctil.

Principios

El objetivo es que la navegación resulte natural y familiar sin dominar la interfaz de usuario ni desviar la atención del contenido. Los siguientes principios ayudan a establecer un modelo de referencia para una experiencia del usuario intuitiva y coherente en todas las apps para TV.

Eficiente

Haz que acceder al contenido sea rápido y fácil. Los usuarios quieren acceder al contenido rápidamente, con una cantidad mínima de clics. Organiza tu información de modo que requiera la menor cantidad de pantallas posible.

Predecible

Sigue las prácticas recomendadas a fin de que la navegación sea predecible para los usuarios. No reinventes los patrones de navegación innecesariamente, ya que genera imprevisibilidad y confusión.

Intuitiva

Haz que la navegación sea lo suficientemente simple como para admitir sin problemas los comportamientos ampliamente adoptados de los usuarios. No compliques demasiado agregando capas de navegación innecesarias.

Controladores

Los controles están disponibles en una variedad de estilos, desde un control remoto minimalista hasta controles de juegos complejos. Todos los controles incluyen un mando de dirección (pad direccional), además de los botones Seleccionar, Inicio y Atrás. Otros botones varían según el modelo.

Ejemplo de control remoto
Figura 1: Ejemplo de un control remoto de TV.

Pad direccional
El método de navegación principal en TV es a través del pad direccional, que incluye botones de hardware direccionales arriba, abajo, izquierda y derecha. El pad direccional transfiere el enfoque de un objeto al más cercano, en la dirección en la que se presionó el botón.

Botón Seleccionar
Selecciona el elemento en pantalla enfocado.

Botón de inicio
Lleva al usuario a la pantalla principal del sistema.

Botón Atrás
Brinda a los usuarios una forma de volver a la vista anterior.

Botón del micrófono
Invoca al Asistente de Google o la entrada de voz.

Navegación con pad direccional

En un dispositivo de TV, los usuarios navegan con un pad direccional o las teclas de flecha. Este tipo de control limita los movimientos a arriba, abajo, izquierda y derecha. Si quieres compilar una app excelente optimizada para TV, debes proporcionar un esquema de navegación en el que el usuario pueda aprender rápidamente cómo navegar por la app con estos controles limitados.

El framework de Android controla la navegación direccional entre los elementos de diseño automáticamente, por lo que, por lo general, no necesitas hacer nada más para tu app. Sin embargo, debes probar minuciosamente la navegación con un controlador de pad direccional para detectar problemas de navegación.

Sigue estos lineamientos para probar que el sistema de navegación de tu app funcione bien con un pad direccional en un dispositivo de TV:

  • Asegúrate de que un usuario con un controlador de pad direccional pueda navegar por todos los controles visibles en la pantalla.
  • Para desplazarte por listas con enfoque, asegúrate de que los botones hacia arriba y hacia abajo del pad direccional se desplacen por la lista y de que el botón de selección seleccione un elemento de ella. Verifica que los usuarios puedan seleccionar un elemento de la lista y que esta continúe desplazándose cuando se selecciona un elemento.
  • Asegúrate de que el cambio de un control a otro sea sencillo y predecible.

Cómo modificar la navegación direccional

El framework de Android aplica automáticamente un esquema de navegación direccional basado en la posición relativa de los elementos enfocables en tus diseños. Prueba el esquema de navegación generado en tu app con un controlador de pad direccional. Después de la prueba, si decides que quieres que los usuarios se muevan por tus diseños de una manera específica, puedes configurar una navegación direccional explícita para tus controles.

En la siguiente muestra de código, se indica cómo definir el próximo control que recibirá el foco para un objeto de diseño TextView:

<TextView android:id="@+id/Category1" android:nextFocusDown="@+id/Category2" />

En la siguiente tabla, se enumeran todos los atributos de navegación disponibles para widgets de interfaz de usuario de Android:

Atributo Función
nextFocusDown Define la siguiente vista que recibirá el enfoque cuando el usuario navegue hacia abajo.
nextFocusLeft Define la siguiente vista que recibirá el enfoque cuando el usuario navegue hacia la izquierda.
nextFocusRight Define la siguiente vista que recibirá el enfoque cuando el usuario navegue hacia la derecha.
nextFocusUp Define la siguiente vista que recibirá el enfoque cuando el usuario navegue hacia arriba.

Para usar uno de estos atributos de navegación explícitos, establece el valor en android:id de otro widget en el diseño. Asegúrate de configurar el orden de navegación como un bucle, de modo que el último control dirija el enfoque de vuelta al primero.

Cómo proporcionar enfoque y selección claros

El éxito del esquema de navegación de una app en dispositivos de TV depende de qué tan fácil sea para el usuario determinar qué elemento de la interfaz de usuario está enfocado. Si no proporcionas una indicación clara del elemento enfocado y, por lo tanto, sobre qué elemento puede realizar una acción el usuario, este puede frustrarse rápidamente y salir de tu app. Por el mismo motivo, es importante tener siempre enfocado un elemento sobre el que el usuario pueda realizar una acción inmediatamente después de que se inicie la app o en cualquier momento en que esté inactiva.

En el diseño y la implementación de tu app, usa color, tamaño, animación o una combinación de estos atributos para ayudar a los usuarios a determinar fácilmente qué acciones pueden realizar a continuación. Usa un esquema uniforme para indicar el enfoque de tu aplicación.

Android proporciona los recursos de la lista de estados de elementos de diseño para implementar una forma de destacar controles seleccionados y enfocados. En el siguiente ejemplo de código, se muestra cómo habilitar el comportamiento visual para que un botón indique que un usuario navegó al control y lo seleccionó:

<!-- res/drawable/button.xml -->
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:drawable="@drawable/button_pressed" /> <!-- pressed -->
    <item android:state_focused="true"
          android:drawable="@drawable/button_focused" /> <!-- focused -->
    <item android:state_hovered="true"
          android:drawable="@drawable/button_focused" /> <!-- hovered -->
    <item android:drawable="@drawable/button_normal" /> <!-- default -->
</selector>

En el siguiente código de muestra de diseño XML, se aplica el elemento de diseño de la lista de estados anterior en un Button:

<Button
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:background="@drawable/button" />

Asegúrate de proporcionar suficiente padding dentro de los controles enfocables y seleccionables para que las zonas destacadas a su alrededor sean claramente visibles.

Navegación con el botón Atrás

Para mantener la coherencia entre las apps de la plataforma, asegúrate de que el comportamiento del botón Atrás siga estos lineamientos.

Usa un comportamiento predecible del botón Atrás

Para crear una experiencia de navegación fácil y predecible, cuando el usuario presione el botón Atrás del control remoto, llévalo al destino anterior.

Una imagen que describe el flujo de navegación cuando se usa la navegación superior
Figura 2: Flujo con la navegación superior
Una imagen que describe el flujo de navegación cuando se usa la navegación lateral
Figura 3: Flujo con la navegación lateral

Si el usuario navega desde un elemento de menú hasta una tarjeta ubicada en el medio de la página y luego presiona el botón Atrás, el resultado dependerá de si la app usa la navegación superior o la izquierda:

  • La app usa navegación superior: Para llevar al usuario a la parte superior de la página, se desplaza rápidamente y activa el enfoque en el menú.
  • La app usa la navegación izquierda: Activa el menú lateral izquierdo y enfócate en el elemento de menú activo en ese momento.

Asegúrate de que el botón Atrás no esté restringido por pantallas de confirmación ni parte de un bucle infinito.

Captura de pantalla que muestra un diálogo en el que se pregunta a los usuarios si desean salir
Figura 4: Control de salida

Qué no debes hacer.
Evita el control de acceso de salida. Permite que los usuarios salgan de la app sin confirmación.


Captura de pantalla que muestra un bucle de navegación
Figura 5: Bucle de navegación

Qué no debes hacer.
Nunca ingreses el bucle infinito de cerrar y abrir el menú. Lo ideal es que presiones el botón Atrás para salir de la app. No muestres un botón de salida en el menú, a menos que sea un caso especial, como un perfil infantil.

No muestres un botón hacia arriba o hacia atrás

A diferencia de los dispositivos de mano, el botón Atrás del control remoto se usa para navegar hacia atrás en una TV. No es necesario mostrar un botón Atrás virtual en la pantalla:

Captura de pantalla que muestra un botón de retroceso suave en la pantalla
Figura 6: Botón suave Atrás

Qué no debes hacer.

Muestra un botón para cancelar si es necesario

Si las únicas acciones visibles son de confirmación, destructivas o de compra, se recomienda tener un botón Cancel que vuelva al destino anterior:

Captura de pantalla que muestra un botón de cancelación no definitiva en la pantalla
Figura 7: Botón para cancelar de forma preliminar

Qué debes hacer.

Cómo implementar la navegación hacia atrás

En general, el framework de Android controla bien la navegación hacia atrás, como lo hace con el pad direccional. Si utilizas el componente Navigation, puedes admitir una variedad de gráficos de navegación. En ocasiones, es posible que debas implementar algún comportamiento personalizado, como hacer que el botón Atrás restablezca el enfoque al comienzo de una lista larga.

ComponentActivity, la clase base para FragmentActivity y AppCompatActivity, te permite controlar el comportamiento del botón Atrás mediante su OnBackPressedDispatcher, que puedes recuperar llamando a getOnBackPressedDispatcher().

Para obtener más información, consulta Cómo brindar navegación hacia atrás personalizada.

Controles de reproducción en TV

La reproducción de videos es una de las funciones más importantes de la TV. Es importante que los reproductores de video de las apps de Android TV se comporten de la misma manera. Consulta los lineamientos de controles de reproducción para TV.

Navegación por la pestaña En vivo

Además de cumplir con los requisitos de calidad de las apps para TV, las apps con un feed de TV en vivo integrado en la pestaña En vivo también deben cumplir con los requisitos de reproducción directa y sin inconvenientes, como se describe en las siguientes secciones.

Reproducción sin inconvenientes

La reproducción sin inconvenientes se aplica al comportamiento en la app después de cualquier vínculo directo de canal en vivo o lineal de Google TV y Android TV.

Los usuarios que hagan clic en un vínculo directo a un canal en vivo o lineal desde Google TV y Android TV deberán dirigirse directamente a la reproducción del canal, sin bloquear ni retrasar las pantallas de la app de destino. No se permiten los flujos de acceso, los flujos de registro, los videos de desarrollo de la marca ni otras demoras.

Sin embargo, si el vínculo directo inicia la carga de la app de destino desde un inicio en frío, se permite esta demora en el inicio antes de la reproducción. En este caso, también se permite un video o una animación de marca de inicio de la app. Es poco probable que esta experiencia de inicio en frío ocurra más de una vez por sesión.

Además, si sintonizar el canal con vínculo directo tarda unos segundos, se permite mostrar la marca del canal o servicio. Sin embargo, su duración solo debe ser la que se complete en cargar el canal (y debe ser similar a los tiempos de carga promedio del canal dentro de la app).

Si el usuario salió de su cuenta o no está suscrito, puedes bloquear la reproducción de un canal pago para completar un flujo de acceso o registro.

Directo

Cuando los usuarios inician una app desde un vínculo directo en la pestaña En vivo y luego presionan el botón Atrás, deben regresar a la pestaña En vivo una vez al presionar el botón Atrás, sin importar cuánto tiempo haya transcurrido. Este comportamiento de retorno directo es obligatorio para todos los vínculos directos de la pestaña En vivo en Google TV y Android TV.

Los vínculos directos de las pestañas en vivo se distinguen por haber agregado un parámetro de vínculo directo: ?exit_on_back=[true|false]. Las apps deben analizar este parámetro para determinar si la app se inició desde la pestaña En vivo. Si exit_on_back es true, las apps deben implementar el comportamiento de retroceso directo.

Ten en cuenta que, si el usuario presiona cualquier botón que no sea el de atrás cuando presiona el primer botón después del vínculo directo, no se aplica el requisito de retroceso directo, y solo se requiere el comportamiento del botón Atrás estándar.

Por ejemplo, supongamos que después de seguir un vínculo directo el usuario presiona el botón de selección del pad direccional, el cual abre una superposición de controles. El usuario espera a que desaparezca la superposición y, luego, presiona el botón Atrás. Como el primer botón que se presiona después de seguir el vínculo directo fue el botón de selección del pad direccional, no se aplica el requisito de retorno directo. En su lugar, se aplica la lógica normal de la pila de actividades de la app.

Las pulsaciones repetidas del botón Atrás deben llevar al usuario a la raíz de la app y, luego, volver a Google TV o Android TV, sin bucles infinitos. Para obtener más información, consulta la sección Comportamiento predecible del botón Atrás.

Destino de inicio fijo

La primera pantalla que ve el usuario cuando inicia la app desde el selector también es la última que ve cuando vuelve al selector después de presionar el botón Atrás.

Los vínculos directos simulan la navegación manual

Ya sea mediante un vínculo directo o una navegación manual a un destino específico, los usuarios pueden usar el botón Atrás para navegar por los destinos de regreso al destino de inicio.

Capturas de pantalla que muestran un vínculo directo a una página de detalles dentro de una app. Si presionas Atrás, te lleva a la pantalla principal de esa app; si lo presionas de nuevo, regresa a la pantalla original.
Figura 8: Incluir vínculos directos a la página de detalles

Los vínculos directos a una app desde otra app simulan la navegación manual. Por ejemplo, si el usuario va directamente a una página de detalles en la app de Moviestar desde Google TV y presiona el botón Atrás, se lo dirigirá a la página principal de la app de Moviestar.

Ruta clara a todos los elementos enfocables

Permite que los usuarios naveguen por tu IU con una dirección clara. Si no hay una ruta directa para llegar a un control, considera reubicarlo.

Ejemplo de Navigation enfocable
Figura 9: Controla la concentración.

Sí.
Coloca controles, como la acción de búsqueda que se muestra aquí, en ubicaciones que no se superpongan con otros elementos en los que se puede hacer clic.

Ejemplo de Navigation enfocable
Figura 10: Controla la concentración.

Qué no debes hacer.
Evita los diseños que contengan controles en lugares de difícil acceso. No es fácil de administrar con el pad direccional acceder a la acción de búsqueda que se muestra aquí.

Ejes

Crea tu diseño de manera tal que aproveche los ejes horizontales y verticales. Asigna una función específica a cada dirección para agilizar la navegación por jerarquías grandes.

Ejemplo de ejes de navegación
Figura 11: Recorrido

Sí.
Las categorías se pueden recorrer en el eje vertical, y los elementos dentro de cada categoría se pueden explorar en el eje horizontal.

Ejemplo de ejes de navegación
Figura 12: Recorrido

Qué no debes hacer.
Evita las jerarquías de diseño complejas y anidadas.