Gérer les fenêtres

ChromeOS est compatible avec les applications Android dans plusieurs fenêtres. Le système affiche les applications dans des conteneurs de fenêtre dont la taille est déterminée par le facteur de forme de l'appareil, comme illustré dans la figure 1.

Figure 1 : Fenêtre d'une application sur différents appareils.

Il est important de concevoir des mises en page qui fonctionnent avec différentes tailles d'écran. Si vous suivez les consignes Android concernant la prise en charge des différentes tailles d'écran, votre application fonctionne également bien lorsqu'elle est exécutée sur ChromeOS.

Cette page explique comment vous assurer que la fenêtre de votre application se lance correctement, se redimensionne facilement et affiche tout son contenu lorsque sa taille change.

Taille du lancement initial

Les applications peuvent demander leur taille de lancement initiale de différentes manières:

  • Utilisez une taille de lancement uniquement dans les environnements de bureau. Cela permet au gestionnaire de fenêtres de définir les limites et l'orientation appropriées. Pour indiquer une préférence en mode ordinateur, ajoutez les balises Meta suivantes dans <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Utilisez des limites de lancement statiques. Utilisez <layout> dans l'entrée du fichier manifeste de votre activité pour spécifier une taille de départ "fixe", comme dans l'exemple suivant:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Utiliser des limites de lancement dynamiques. Une activité peut créer et utiliser ActivityOptions.setLaunchBounds(Rect) lors de la création d'une activité. En spécifiant un rectangle vide, vous pouvez agrandir votre application.

Redimensionner les fenêtres

Dans ChromeOS, les utilisateurs peuvent redimensionner la fenêtre d'une application comme d'habitude: en faisant glisser l'angle inférieur droit, comme illustré dans la figure 2.

Figure 2. Fenêtre d'application redimensionnable.

Il existe deux options pour gérer le redimensionnement de la fenêtre lorsque vous utilisez la classe View:

  • Réagissez de manière dynamique aux modifications de configuration en appelant onConfigurationChanged(..). Par exemple, vous pouvez ajouter android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" au fichier manifeste de l'activité. Pour en savoir plus sur la gestion des modifications de configuration, consultez Gérer les modifications de configuration.
  • Laissez le système redémarrer l'activité. Dans ce cas, implémentez onSaveInstanceState et utilisez le composant d'architecture ViewModel pour restaurer l'état enregistré précédent.

Lorsque vous utilisez Jetpack Compose, le comportement de redimensionnement dépend de la configuration de votre activité. S'il gère les modifications de manière dynamique, une recomposition est déclenchée lorsque la taille de la fenêtre change. Si l'activité est redémarrée par le système, une composition initiale se produit après le redémarrage. Dans tous les cas, il est important de créer des mises en page Compose qui s'adaptent à l'évolution de la taille des fenêtres. Ne partez pas du principe que les tailles sont fixes.

Dimensions de la fenêtre

Demandez à vos activités de lire leurs dimensions de fenêtre à chaque démarrage et d'organiser leur contenu en fonction de la configuration actuelle.

Pour déterminer la configuration actuelle, appelez getResources().getConfiguration() sur l'activité en cours. N'utilisez pas la configuration de l'activité d'arrière-plan ni de la ressource système. L'activité en arrière-plan n'a pas de taille, et la configuration système peut contenir plusieurs fenêtres avec des tailles et des orientations en conflit. Par conséquent, aucune donnée utilisable ne peut être extraite.

Notez que la taille de la fenêtre et celle de l'écran ne sont pas identiques. Pour obtenir la taille de la fenêtre en DP, utilisez Activity.getResources().getConfiguration().screenWidth et Activity.getResources().getConfiguration().screenHeight. Vous n'aurez probablement jamais besoin d'utiliser la taille de l'écran.

Limites du contenu

Les limites du contenu d'une fenêtre peuvent changer après son redimensionnement. Par exemple, la zone utilisée par l'application peut changer si celle-ci devient trop grande pour tenir sur l'écran. Respectez les consignes suivantes :

  • Les applications qui utilisent le processus de mise en page d'Android sont automatiquement disposées dans l'espace disponible.
  • Les applications natives doivent lire la zone disponible et surveiller les changements de taille pour éviter d'avoir des éléments d'interface utilisateur inaccessibles. Appelez les méthodes suivantes pour déterminer la taille initiale disponible pour cette surface:

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

    La surveillance continue peut être effectuée à l'aide d'un observateur:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Ajouter un écouteur à view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Si l'application préredimensionne son illustration, faites-le chaque fois que la résolution change.

Redimensionnement de format libre

ChromeOS permet de redimensionner librement n'importe quelle fenêtre: l'utilisateur peut modifier la largeur, la hauteur et la position d'une fenêtre à l'écran. De nombreuses applications Android sont écrites sans redimensionnement de format libre. Voici quelques points à prendre en compte:

  • La position de l'écran peut changer. Utilisez toujours le système pour effectuer des transformations de coordonnées de fenêtre à écran et d'écran à fenêtre.
  • Si vous utilisez le système d'affichage d'Android, la mise en page de la fenêtre change automatiquement lorsque sa taille change.
  • Si vous n'utilisez pas le système d'affichage et que vous prenez le contrôle de la surface, votre application doit gérer elle-même les changements de taille.
  • Pour les applications natives, utilisez les membres mLastContent ou la vue de contenu pour déterminer la taille initiale.
  • Lorsque l'application est en cours d'exécution, écoutez les événements onContentRectChangedNative ou onGlobalLayout pour réagir aux changements de taille.
  • Lorsque la taille de l'application change, redimensionnez ou actualisez les mises en page et les illustrations, et mettez à jour les zones de saisie.

Mode plein écran

Le mode plein écran fonctionne de la même manière que sur Android standard. Si la fenêtre ne couvre pas tout l'écran, les requêtes de filtrage complet (masquant tous les éléments d'interface utilisateur du système) sont ignorées. Lorsque l'application est agrandie, les méthodes normales d'affichage en plein écran, les mises en page et les fonctions sont exécutées. Cela masque les éléments de l'interface utilisateur du système (la barre de contrôle des fenêtres et l'étagère).

Orientation de l'écran

L'orientation la plus courante pour une application Android est le mode portrait, car c'est ainsi que la plupart des téléphones sont tenus. Si le mode portrait est adapté aux téléphones, il est mauvais pour les ordinateurs portables et les tablettes, où le mode paysage est privilégié. Afin d'obtenir les meilleurs résultats pour votre application, envisagez de prendre en charge les deux orientations.

Certaines applications Android supposent que lorsqu'un appareil est en mode Portrait, la valeur de rotation est Surface.ROTATION_0. Cela peut être le cas pour la plupart des appareils Android. Toutefois, lorsque l'application est dans un mode ARC donné, la valeur de rotation pour l'orientation portrait peut ne pas être Surface.ROTATION_0.

Pour obtenir une valeur de rotation précise lors de la lecture de l'accéléromètre ou de capteurs similaires, utilisez la méthode Display.getRotation() et permutez l'axe en conséquence.

L'activité racine et l'orientation

Une fenêtre de Chromebook se compose d'une pile de fenêtres d'activité. Chaque fenêtre de la pile a la même taille et la même orientation.

Les changements soudains d'orientation et de taille sont source de confusion dans un environnement de bureau. Le gestionnaire de fenêtre du Chromebook évite ce problème d'une manière semblable au mode côte à côte d'Android: l'activité située en bas de la pile contrôle les attributs de toutes les activités qui la précèdent. Cela peut entraîner des situations inattendues, dans lesquelles une activité nouvellement démarrée qui est en mode portrait et non redimensionnable devient en mode paysage et peut être redimensionnable.

Le mode Appareil a un effet ici: en mode Tablette, l'orientation n'est pas verrouillée et chaque fenêtre conserve sa propre orientation, comme c'est normal sur Android.

Consignes d'orientation

Suivez ces consignes pour gérer l'orientation:

  • Si vous n'acceptez qu'une seule orientation, ajoutez les informations au fichier manifeste afin que le gestionnaire de fenêtres en soit informé avant de démarrer l'application. Lorsque vous spécifiez l'orientation, faites-le également si possible. Les Chromebooks sont souvent convertibles, et une application à l'envers nuit à l'expérience utilisateur.
  • Essayez de conserver une seule orientation. Évitez de demander une orientation dans le fichier manifeste et d'en définir une autre par programmation par la suite.
  • Veillez à modifier l'orientation en fonction de la taille de la fenêtre. L'utilisateur peut être bloqué dans une petite fenêtre en mode portrait et ne pas pouvoir revenir à une fenêtre paysage plus grande.
  • Des commandes de fenêtre dans Chrome permettent de basculer entre toutes les mises en page disponibles. En choisissant la bonne option d'orientation, vous pouvez vous assurer que l'utilisateur dispose de la bonne mise en page après avoir lancé l'application. Si une application est disponible en mode portrait et paysage, utilisez si possible le mode paysage par défaut. Une fois cette option définie, elle est mémorisée pour chaque application.
  • Essayez d'éviter les changements d'orientation inutiles. Par exemple, si l'orientation de l'activité est en mode portrait, mais que l'application appelle setRequestedOrientation(LANDSCAPE) au moment de l'exécution, cela entraîne un redimensionnement inutile de la fenêtre, gênant pour l'utilisateur et susceptible de redémarrer l'application que l'application ne peut pas gérer. Il est préférable de définir l'orientation une seule fois, par exemple dans le fichier manifeste, et de ne la modifier que si nécessaire.

Autres points à prendre en compte

Voici d'autres éléments à prendre en compte lorsque vous travaillez avec des applications Android sous ChromeOS:

  • N'appelez pas finish() dans la méthode onDestroy de votre activité. Cela entraîne la fermeture de l'application lors du redimensionnement et non au redémarrage.
  • N'utilisez pas de types de fenêtres non compatibles, tels que TYPE_KEYGUARD et TYPE_APPLICATION_MEDIA.
  • Accélérer le redémarrage des activités en mettant en cache les objets précédemment alloués
  • Si vous ne souhaitez pas que l'utilisateur redimensionne votre application, spécifiez android:resizeableActivity=false dans votre fichier manifeste.
  • Testez votre application pour vous assurer qu'elle gère correctement les changements de taille de fenêtre.