Administración de ventanas

El Sistema operativo Chrome admite apps para Android en varias ventanas. El sistema procesa las apps en contenedores de ventana cuyo tamaño se determina según el factor de forma del dispositivo, como se muestra en la Figura 1.

Figura 1: La ventana de una app en diferentes dispositivos

Cómo cambiar el tamaño de las ventanas

En el Sistema operativo Chrome, los usuarios pueden cambiar el tamaño de la ventana de una app de la manera habitual, arrastrando la esquina inferior derecha, como se muestra en la Figura 2.

Figura 2: La ventana de una app que puede cambiar de tamaño

Existen dos opciones para controlar el cambio de tamaño de una ventana:

  • Para responder a los cambios de configuración de forma dinámica, llama al elemento onConfigurationChanged(..) y agrega, por ejemplo, el objeto android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" al manifiesto de la actividad. Consulta los documentos de Cómo manejar cambios en la configuración para obtener más información sobre el manejo de estos cambios.
  • Permite que el sistema reinicie la actividad. En este caso, debes implementar el objeto onSaveInstanceState y usar el componente de arquitectura ViewModel para restablecer el estado que se guardó anteriormente.

En esta página, se muestra cómo garantizar que se inicie correctamente la ventana de tu app, que cambie de tamaño sin problemas y que pueda mostrar todo su contenido cuando cambie de tamaño.

Dimensiones de una ventana

Una actividad debe leer las dimensiones de su ventana cada vez que se inicia y organizar su contenido según la configuración actual.

Para determinar la configuración actual, llama al objeto getResources().getConfiguration() en la actividad actual. No uses la configuración de la actividad en segundo plano ni el recurso del sistema. La actividad en segundo plano no tiene un tamaño, y la configuración del sistema puede contener varias ventanas con tamaños y orientaciones en conflicto, por lo que no se pueden extraer datos que se puedan usar.

Ten en cuenta que el tamaño de la ventana y el tamaño de pantalla no son los mismos. Para obtener el tamaño de la ventana en DP, usa los objetos Activity.getResources().getConfiguration().screenWidth y Activity.getResources().getConfiguration().screenHeight. Es probable que nunca debas usar el tamaño de la pantalla.

Límites del contenido

Los límites del contenido de una ventana pueden cambiar si se modifica el tamaño. Por ejemplo, el área dentro de la ventana que usa la app puede cambiar si la ventana se agranda demasiado para ajustarse a la pantalla. Por ello, sigue estos lineamientos:

  • Las apps que usan el proceso de diseño de Android se presentan automáticamente en el espacio disponible.
  • Las apps nativas deben leer el área disponible y supervisar los cambios de tamaño para evitar tener elementos de la IU inaccesibles. Llama a los siguientes métodos a fin de determinar el tamaño inicial disponible para esta plataforma:

    • NativeActivity.mLastContent[X/Y/Width/Height]()
    • findViewById(android.R.id.content).get[Width/Height]()

    El monitoreo continuo se puede realizar mediante un observador:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Agrega un objeto de escucha al elemento view.addOnLayoutChangeListener(findViewById(android.R.id.content)). Si la app ajusta previamente su material gráfico, deberá hacerlo cada vez que cambie la resolución.

Cómo cambiar el tamaño de formato libre

El Sistema operativo Chrome permite cambiar el tamaño de cualquier ventana libremente: el usuario puede cambiar el ancho, la altura y la posición de la ventana en la pantalla. Muchas apps para Android están escritas sin tener en cuenta el cambio de tamaño de formato libre. Considera los siguientes problemas:

  • La posición de la pantalla puede cambiar. Siempre usa el sistema para realizar transformaciones de las coordenadas de ventana a pantalla y de pantalla a ventana.
  • Si usas el sistema de vista de Android, el diseño de la ventana cambia automáticamente cuando cambia su tamaño.
  • Si no usas el sistema de visualización y tomas control de la superficie, la app debe controlar los cambios de tamaño por su cuenta.
  • Las apps nativas deben usar los miembros de mLastContent o usar la vista de contenido para determinar el tamaño inicial.
  • Cuando se esté ejecutando la app, deberías escuchar los eventos onContentRectChangedNative o onGlobalLayout con el objetivo de reaccionar ante los cambios de tamaño.
  • Cuando cambie el tamaño de la app, debería modificar la escala o volver a cargar los diseños y el material gráfico, así como actualizar las áreas de entrada.

Modo de pantalla completa

El modo de pantalla completa funciona de la misma manera que en Android. Si la ventana no cubre la pantalla completa, se ignoran las solicitudes de uso de pantalla completa (que oculta toda la IU del sistema). Cuando se maximiza la app, se realizan los métodos, los diseños y las funciones de pantalla completa habituales, lo que oculta los elementos de la IU del sistema (la barra de control de la ventana y la biblioteca).

Orientación de la pantalla

La orientación más común de una app para Android es la vertical, ya que la mayoría de los teléfonos se sostienen de esa manera. Si bien la orientación vertical es buena para los teléfonos, es mala para las laptops y tablets, en las que se prefiere la orientación horizontal. A fin de obtener los mejores resultados para la app, procura admitir ambas orientaciones.

Algunas apps para Android suponen que, cuando un dispositivo se mantiene en modo vertical, el valor de rotación siempre es Surface.ROTATION_0. Esto puede ser así para la mayoría de los dispositivos Android. Sin embargo, si la app se encuentra en un determinado modo de ARC, es posible que el valor de rotación de la orientación vertical no sea Surface.ROTATION_0.

Si deseas obtener un valor de rotación preciso mientras se lee el acelerómetro o sensores similares, usa el método Display.getRotation() para intercambiar el eje según corresponda.

La actividad raíz y la orientación

Una ventana de Chromebook consta de una pila de ventanas de actividad. Cada ventana de la pila tiene el mismo tamaño y la misma orientación.

Los cambios de tamaño y orientación repentinos son confusos en un entorno de escritorio. El administrador de ventanas de la Chromebook evita esos cambios de una manera similar al modo de lado a lado de Android: la actividad de la parte inferior de la pila controla los atributos de todas las actividades superiores. Eso puede generar situaciones inesperadas en las que una actividad recién iniciada, cuyo tamaño no se puede cambiar y está en modo vertical, se convierta al modo horizontal, cuyo tamaño sí se puede modificar.

El modo del dispositivo influye en este caso: en el modo de tablet, la orientación no está bloqueada, y cada ventana conserva su propia orientación, como es normal en Android.

Lineamientos de orientación

Sigue estos lineamientos para procesar la orientación:

  • Si solo admites una orientación, agrega la información al manifiesto para que el administrador de ventanas esté al tanto de esto antes de iniciar la aplicación. Cuando especifiques una orientación, asegúrate de proporcionar detalles de las orientaciones de los sensores siempre que sea posible. Las Chromebooks suelen ser convertibles, y las apps al revés son molestas.
  • Intenta mantener una única orientación seleccionada. Evita solicitar una orientación en el manifiesto y establecer otra orientación programática más tarde.
  • Ten cuidado cuando cambies la orientación según el tamaño de la ventana. Es posible que el usuario se quede atascado en una ventana pequeña de tamaño vertical y no pueda volver a una ventana horizontal más grande.
  • En Chrome, existen controles de ventana para activar o desactivar todos los diseños disponibles. Si eliges la opción de orientación correcta, puedes asegurarte de que el usuario tenga el diseño correcto cuando se inicia la app. Si una app está disponible en modo vertical y horizontal, se configura de forma predeterminada en horizontal, si es posible. Una vez que se configura esa opción, se recuerda en cada app.
  • Intenta evitar cambios de orientación innecesarios. Por ejemplo, si la orientación de la actividad es VERTICAL, pero la app llama al objeto setRequestedOrientation(LANDSCAPE) durante el tiempo de ejecución, se produce un cambio de tamaño de ventana innecesario, que molesta al usuario y que posiblemente reinicie la app si no puedes controlarlo. Es mejor configurar la orientación una vez, por ejemplo, en el manifiesto, y solo cambiarla si es necesario.

Tamaño inicial de lanzamiento

Las apps pueden especificar su tamaño de lanzamiento inicial de las siguientes maneras:

  • Usa un tamaño de lanzamiento solo en entornos de escritorio, lo que ayuda al administrador de ventanas a brindarte los límites y la orientación adecuados. Para indicar una preferencia cuando se usa en modo escritorio, agrega las siguientes metaetiquetas en de la etiqueta <activity>:

    <meta-data android:name="WindowManagerPreference:FreeformWindowSize"
               android:value="[phone|tablet|maximize]" />
    <meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
               android:value="[portrait|landscape]" />
    
  • Usa límites de lanzamiento estáticos. Utiliza el objeto <layout> dentro de la entrada de manifiesto de tu actividad para especificar un tamaño inicial "fijo". Observa este ejemplo:

    <layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
    
  • Usa límites de lanzamiento dinámicos. Una actividad puede crear y usar el elemento ActivityOptions.setLaunchBounds(Rect) en la creación de una nueva actividad. Cuando especificas un rectángulo vacío, tu app se puede maximizar.

Otros factores que considerar

Estos son otros aspectos que debes tener en cuenta cuando trabajas con apps para Android en el Sistema operativo Chrome:

  • No llames al objeto finish() en el método onDestroy de tu actividad. Esta acción hace que la app se cierre cuando se cambia el tamaño y no se reinicie, suponiendo que tu app tenga que reiniciarse.
  • No uses tipos de ventana que no sean compatibles, como los objetos TYPE_KEYGUARD o TYPE_APPLICATION_MEDIA.
  • Asegúrate de que el reinicio de una actividad sea rápido. Para ello, almacena en caché los objetos que hayas asignado previamente.
  • Si no quieres que el usuario cambie el tamaño de la app, especifica el objeto android:resizeableActivity=false en el archivo de manifiesto.
  • Prueba la app para asegurarte de que controle los cambios en el tamaño de la ventana de forma adecuada.