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 efectivo para tu app para TVs depende del entendimiento de estos controles limitados y de las limitaciones de los usuarios mientras usan tu app. A medida que compilas apps para Android para TV, debes prestar especial atención a la manera en que el usuario navega por tu app mediante los botones del control remoto en lugar de una pantalla táctil.

Principios

El objetivo es que la navegación se sienta 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 de TV.

Eficiente

Simplifica el acceso al contenido. Los usuarios quieren acceder al contenido rápidamente con una cantidad mínima de clics. Organiza la información de manera que requiera la menor cantidad de pantallas.

Previsibilidad

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

Funciones intuitivas

Simplifica la navegación lo suficiente como para admitir sin problemas los comportamientos de los usuarios ampliamente adoptados No compliques demasiado las cosas agregando capas innecesarias de navegación.

Controladores

Los controladores vienen en una variedad de estilos, desde un control remoto minimalista hasta controles de juegos complejos. Todos los controladores incluyen un pad direccional (D-pad) y botones de selección, inicio y atrás. Otros botones varían según el modelo.

Un control remoto de televisión
Figura 1. Ejemplo de un control remoto de TV

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

Botón de selección
Selecciona el elemento en pantalla con enfoque.

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

Botón Atrás
Les 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 el pad direccional

En un dispositivo de TV, los usuarios navegan con un pad direccional o teclas de flechas. Este tipo de control limita el movimiento hacia arriba, abajo, izquierda y derecha. Para crear una buena app optimizada para TV, debes proporcionar un esquema de navegación en el que el usuario aprenda rápidamente cómo navegar por tu app con estos controles limitados.

El marco de trabajo de Android controla la navegación direccional entre los elementos de diseño de manera automática, por lo que, generalmente, no necesitas realizar ninguna acción adicional para tu app. Sin embargo, debes probar rigurosamente la navegación con un controlador de pad direccional para detectar si hay algún problema.

Sigue estos lineamientos para probar que el sistema de navegación de tu app funciona correctamente 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 desplazarse en listas con enfoque, asegúrate de que los botones arriba y abajo del pad direccional se desplacen por la lista, y que el botón de selección seleccione un elemento de esta. Verifica que los usuarios puedan seleccionar un elemento de la lista y puedan seguir desplazándose luego de hacerlo.
  • Asegúrate de que el cambio de un control a otro sea sencillo y predecible.

Cómo modificar la navegación direccional

El marco de trabajo 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 mediante un controlador de pad direccional. Una vez que lo hagas, si quieres que los usuarios se desplacen por tus diseños de una manera específica, puedes configurar una navegación direccional explícita para tus controles.

En el siguiente ejemplo de código, se muestra cómo definir el siguiente control que recibirá el enfoque 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, debes establecer el valor en el android:id de otro widget en el diseño. Asegúrate de configurar el orden de navegación como un bucle, para que el último control dirija el enfoque 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 si un usuario puede determinar rápidamente qué elemento de la interfaz de usuario está en primer plano. Si no proporcionas una indicación clara del elemento en primer plano y, por lo tanto, en qué elemento el usuario puede realizar una acción, estos pueden frustrarse rápidamente y salir de la app. Por este motivo, es importante que siempre haya un elemento en primer plano sobre el cual el usuario pueda realizar una acción inmediatamente después de que se inicie la app, o cuando 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 que los usuarios puedan determinar qué acciones pueden realizar a continuación. Usa un esquema uniforme para indicar el enfoque dentro de tu app.

Android proporciona los recursos de la lista de estados de elementos de diseño Drawable state list resources 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 -->
<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, 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 espacio de relleno entre los controles que pueden enfocarse y seleccionarse para que las zonas destacadas que los rodean puedan verse claramente.

Navegación con el botón Atrás

Para garantizar la coherencia en todas 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 sencilla y predecible, cuando el usuario presione el botón Atrás del control remoto, llévalo al destino anterior.

El flujo de navegación cuando se usa la navegación superior
Figura 2. Flujo con navegación superior
El flujo de navegación cuando se usa la navegación lateral
Figura 3. Flujo con navegación lateral

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

  • La app usa la navegación superior: Lleva al usuario a la parte superior de la página desplazándote rápidamente y activando el enfoque en el menú.
  • La app usa la navegación izquierda: Activa el menú del lado izquierdo y enfócate en el elemento de menú activo en ese momento.

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

Un diálogo que les pregunta a los usuarios si quieren salir
Figura 4. Bloqueo de salida

No lo hagas.
Evita el bloqueo de salida. Permite que los usuarios salgan de la app sin confirmación.


El bucle de navegación entre el cierre y la apertura del menú
Figura 5. Bucle de navegación

No lo hagas.
Nunca ingreses al bucle infinito de cerrar y abrir el menú. Lo ideal es que, al presionar el botón Atrás, se salga 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 Arriba ni Atrás

A diferencia de los dispositivos portátiles, 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:

Un botón Atrás virtual que se muestra en la pantalla
Figura 6. Botón Atrás programable

No lo hagas.

Muestra un botón Cancelar si es necesario

Si las únicas acciones visibles son las de confirmación, las destructivas o las de compra, es una buena práctica tener un botón Cancelar que vuelva al destino anterior:

Un botón de cancelar que se muestra junto con las acciones destructivas
Figura 7. Botón Cancelar programable

Hazlo.

Implementa la navegación hacia atrás

Por lo general, el marco de trabajo de Android controla bien la navegación hacia atrás, al igual que el pad direccional. Si usas el componente Navigation, puedes admitir una variedad de gráficos de navegación. En ocasiones, es posible que debas implementar un comportamiento personalizado, como hacer que el botón Atrás restablezca el enfoque al principio de una lista larga.

ComponentActivity, la clase de base para FragmentActivity y AppCompatActivity, te permite controlar el comportamiento del botón Atrás mediante su OnBackPressedDispatcher, al que puedes acceder si llamas 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 video es una de las funciones más importantes de la TV. Es importante que los reproductores de video de las apps en Android TV se comporten de la misma manera. Consulta los lineamientos de los controles de reproducción para TV.

Navegación de la pestaña En vivo

Además de cumplir con los requisitos de calidad de la app de 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 sin interrupciones y transmisión directa, como se describe en las siguientes secciones.

Reproducción sin interrupciones

La reproducción sin interrupciones 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.

Cuando un usuario hace clic en un vínculo directo, se aplican las siguientes reglas:

  • Sin demoras: Los usuarios deben dirigirse directamente a la reproducción del canal sin bloquear ni demorar las pantallas, como los flujos de acceso o registro, o los videos de branding.
  • Excepción de inicio en frío: Si el vínculo directo inicia la carga de la app de destino desde un inicio en frío, se permite la demora de inicio. En este caso, también se permiten los videos o las animaciones de branding de inicio de la app.
  • Excepción de demora de carga: Si la sintonización del canal tarda unos segundos, se permite mostrar el branding. La duración solo debe ser el tiempo que tarda en cargar el canal.

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

Transmisión directa

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 con una sola presión, independientemente del tiempo transcurrido. Este comportamiento de transmisión directa 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 la pestaña En vivo se distinguen por un parámetro de vínculo directo anexado: ?exit_on_back=[true|false]. Las apps deben analizar este parámetro para determinar si se iniciaron desde la pestaña En vivo. Si exit_on_back es true, las apps deben implementar el comportamiento de transmisión directa.

Ten en cuenta que, si el usuario presiona cualquier botón que no sea el botón Atrás como la primera presión después del vínculo directo, no se aplica el requisito de transmisión directa, y solo se requiere el comportamiento estándar del botón Atrás behavior.

Por ejemplo, supongamos que, después de seguir un vínculo directo, el usuario presiona el botón de selección del pad direccional, que muestra 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 presionado después de seguir el vínculo directo fue el botón de selección del pad direccional, no se aplica el requisito de transmisión directa. En cambio, se aplica la lógica normal de la pila de actividades de la app.

Las presiones repetidas del botón Atrás deben llevar al usuario a la raíz de la app y, luego, 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 behavior.

Una arquitectura de navegación bien definida ayuda a los usuarios a comprender dónde se encuentran en tu app y cómo acceder a diferentes contenidos. Considera los siguientes aspectos del diseño de navegación.

Destino de inicio fijo

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

Los vínculos directos simulan la navegación manual

Ya sea que estés usando vínculos directos o navegando manualmente 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, se va a la pantalla principal de esa app y, si vuelves a presionar Atrás,
            se regresa a la pantalla original.
Figura 8. Vínculo directo a una 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 Movistar desde Google TV y, luego, presiona el botón Atrás, se lo lleva a la página principal de la app de Movistar.

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 cambiarlo de ubicación.

Un diseño con controles ubicados en posiciones que no se superponen
Figura 9. Control de la capacidad de enfoque

Hazlo.
Coloca los 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.

Un diseño con controles en ubicaciones de difícil acceso
Figura 10. Control de la capacidad de enfoque

No lo hagas.
Evita los diseños que contienen controles en lugares difíciles de alcanzar. Alcanzar la acción de búsqueda que se muestra aquí podría ser difícil con el pad direccional.

Ejes

Diseña tu diseño para aprovechar los ejes horizontales y verticales. Asigna a cada dirección una función específica, lo que permite navegar rápidamente por jerarquías grandes.

Un diseño que usa categorías verticales y elementos horizontales
Figura 11. Recorrido

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

Una jerarquía de diseño compleja y anidada
Figura 12. Recorrido

No lo hagas.
Evita las jerarquías de diseño complejas y anidadas.