Compatibilidad de tamaño de pantalla para Chromebooks

La implementación de apps para Android en el Sistema operativo Chrome incluye compatibilidad básica con el modo multiventana. En lugar de dibujar automáticamente en la pantalla completa, Android procesa las apps en el Sistema operativo Chrome en diseños apropiados para el factor de forma.

Cómo cambiar el tamaño de tareas y ventanas

Como el tamaño de la ventana de la actividad puede cambiar, las actividades deberían leer la resolución de las actividades al inicio. Las actividades deberían responder a los cambios de resolución mediante una llamada a onConfigurationChanged(..). Por ejemplo, para evitar perder el trabajo del usuario tras la maximización, puedes hacer lo siguiente:

  • Administra los cambios de configuración dinámicamente. Para ello, agrega android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" al manifiesto de la actividad.
  • Restablece el estado anterior con onSaveInstanceState para hacer la transición lo más simple posible. Esto es aplicable si solicitar un reinicio es la única opción.

Cuando busques la configuración actual, usa siempre la configuración de tu actividad actual en getResources().getConfiguration(). No uses la configuración de tu actividad en segundo plano o la del recurso del sistema. La actividad en segundo plano no tiene tamaño, y la configuración del sistema puede contener varias ventanas con tamaños y orientaciones conflictivos, por lo que no se podrán extraer datos utilizables.

Otra consideración importante es que los límites del contenido de la ventana pueden cambiar. Por ejemplo, el área dentro de la ventana que usa la app puede cambiar si la ventana es demasiado grande para ajustarse a la pantalla. Ten en cuenta los siguientes lineamientos:

  • Las apps que utilizan el proceso de diseño de Android deben presentarse 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 IU inaccesibles. Llama a los siguientes métodos a fin de determinar el tamaño inicial disponible para esta superficie:
    • 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 a 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.

El sistema permite cambiar libremente el tamaño. Sin embargo, no todas las apps se escribieron teniendo en cuenta el cambio de tamaño. A continuación, verás algunos problemas potenciales a tener en cuenta:

  • Controla de manera óptima el cambio de tamaño, ya que este proceso podría ocurrir en cualquier momento por diversas razones. Por ello, es realmente importante poder guardar y restaurar el estado lo mejor posible mediante onSaveInstanceState si es necesario reiniciar. Ten en cuenta que esto también es beneficioso para Android en general.
  • Asegúrate también de que el reinicio de una actividad sea rápido. Para ello, almacena en caché los objetos que hayas asignado previamente. Si no usas los mecanismos de diseño de marcos de trabajo, tu app puede usar, por ejemplo, OpenGL y ajustar el contenido, o si aparece alguna otra lógica, deberías escuchar los eventos onConfigurationChanged para evitar que se reinicie la actividad. Asegúrate de especificar todos los eventos de cambio que puedas manejar de forma dinámica.
  • Si no quieres cambiar el tamaño, debes especificarlo en tu archivo de manifiesto.
  • Es importante tener en cuenta que el tamaño de la ventana no es el tamaño de la pantalla y que probablemente nunca necesites el tamaño de la pantalla. Para obtener el tamaño de la ventana, debes usar Activity.getResources().getConfiguration().screenWidth y Activity.getResources().getConfiguration().screenHeight en DP.

Para obtener tu configuración actual, usa siempre el recurso de tu actividad y obtén la configuración desde allí, ya que, de lo contrario, podrías terminar mirando otros elementos, como las propiedades de la pantalla.

Ten en cuenta que la posición de la pantalla también puede cambiar. Asegúrate de usar siempre el sistema para hacer cálculos de espacio de ventana a pantalla o viceversa.

Si usas el sistema de visualización de Android, la ventana debería aparecer automáticamente con un cambio de tamaño.

Si no usas el sistema de visualización y tomas control de la superficie, tu app debe controlar los cambios de tamaño por su cuenta.

Las apps nativas deberían usar los miembros de mLastContent, o bien obtener la vista de contenido para obtener el tamaño inicial.

Una vez que se esté ejecutando la app, deberías escuchar los eventos onContentRectChangedNative o onGlobalLayout con el objetivo de reaccionar ante los cambios de tamaño.

Ten en cuenta que, con un cambio de tamaño, una app debería modificar la escala o volver a cargar los diseños y el material gráfico, y actualizar las áreas de entrada.

Diseño

Si quieres rellenar la pantalla con más información, puedes especificar diferentes diseños o puedes crear el diseño de forma dinámica para el tamaño solicitado. Ten en cuenta que la generación dinámica no suele recomendarse, pero a veces puede ser una posibilidad.

Las apps que no usan el sistema de diseño deberían evitar reiniciarse para realizar un cambio de configuración, ya que pueden ser muy costosas. Estas modificaciones pueden ocurrir por razones obvias, como cambios en el tamaño de la ventana, pero también por algunas no obvias, como una conversión de modo del dispositivo. Al cambiar de laptop a tablet, por ejemplo, se informaría que el teclado físico desapareció. Un reinicio que haga que el usuario espere o incluso pierda trabajo inesperadamente no es una buena experiencia.

Asegúrate de que tu código no intente acceder a los elementos de la IU que hayan desaparecido debido a una operación de cambio de tamaño dinámica.

Supervisa los cambios en la jerarquía de vistas

Agregar un título de control de ventana puede causar algunos problemas. Ten en cuenta las siguientes recomendaciones:

  • No esperes que tu contenido comience en (0,0) de la ventana. El contenido de la ventana puede estar compensado por la altura del subtítulo. Observa la ubicación de la pantalla de la vista con View.getLocationInWindow() para obtener el desplazamiento correcto.
  • No esperes que DecorView sea el titular de contentView. El subtítulo es parte de la jerarquía de la ventana y, si existe, se encuentra entre DecorView y la vista de contenido. Por eso, cumple con lo siguiente:
    • No cambies la jerarquía de las vistas directamente debajo de DecorView.
    • No asumas que el elemento secundario de DecorView es del tipo LinearLayout.
  • No asumas que Configuration.screenHeightDp es la altura del área de contenido de tu app. Parte de esta altura la ocupa la vista de subtítulos, si existe. Lo mismo se aplica a Display.getSize(), y así sucesivamente.

Otros factores que considerar

Estos son otros aspectos que debes tener en cuenta:

  • Si tu actividad siempre está pensada para ejecutarse en pantalla completa, agrega el indicador android:resizeableActivity="false" en tu manifiesto.
  • Los usuarios finales se presentan con controles de ventana para alternar entre 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 al iniciar la app. Si una app está disponible en modo vertical y horizontal, se configura de forma predeterminada en horizontal, si es posible. Una vez configurada esta opción, se recuerda para cada app.
  • Intenta evitar cambios de orientación innecesarios. Por ejemplo, si la orientación de la actividad es VERTICAL, pero la app llama a setRequestedOrientation(LANDSCAPE) en el tiempo de ejecución, se produce un cambio de tamaño de ventana innecesario, que molesta al usuario y posiblemente reinicie la app si esta no puede controlarlo. La opción preferida es configurar la orientación una vez, por ejemplo, en el manifiesto, y solo cambiarla si es necesario.
  • No llames a finish() en el método onDestroy de tu actividad. Esta acción hace que la app se cierre al cambiar el tamaño y no se reinicie, suponiendo que tu app tenga que reiniciarse.
  • No uses tipos de ventana que no sean compatibles, como TYPE_KEYGUARD y TYPE_APPLICATION_MEDIA.

Nota: Te recomendamos probar tu app para asegurarte de que controla los cambios en el tamaño de ventana de manera adecuada.