Gestione delle finestre

ChromeOS supporta le app per Android in più finestre. Il sistema esegue il rendering delle app in contenitori di finestre le cui dimensioni sono determinate dal fattore di forma del dispositivo, come mostrato nella Figura 1.

Figura 1. Una finestra dell'app su diversi dispositivi.

È importante progettare layout che funzionino con schermi di dimensioni diverse. Se segui le linee guida di Android per supportare schermi di diverse dimensioni, la tua app funziona bene anche quando viene eseguita su ChromeOS.

In questa pagina viene spiegato come fare in modo che la finestra dell'app venga avviata correttamente, venga ridimensionata senza problemi e mostri tutti i relativi contenuti quando le sue dimensioni cambiano.

Dimensioni del lancio iniziale

Le app possono richiedere le dimensioni del lancio iniziale nei seguenti modi:

  • Utilizza dimensioni di lancio solo in ambienti desktop. In questo modo il gestore delle finestre può indicarti i limiti e l'orientamento appropriati. Per indicare una preferenza quando utilizzata in modalità desktop, aggiungi i seguenti meta tag all'interno di <activity>:
<meta-data android:name="WindowManagerPreference:FreeformWindowSize"
           android:value="[phone|tablet|maximize]" />
<meta-data android:name="WindowManagerPreference:FreeformWindowOrientation"
           android:value="[portrait|landscape]" />
  • Utilizza limiti di avvio statici. Utilizza <layout> all'interno della voce manifest della tua attività per specificare una dimensione iniziale "fissa", come nell'esempio seguente:
<layout android:defaultHeight="500dp"
            android:defaultWidth="600dp"
            android:gravity="top|end"
            android:minHeight="450dp"
            android:minWidth="300dp" />
  • Utilizza limiti di avvio dinamici. Un'attività può creare e utilizzare ActivityOptions.setLaunchBounds(Rect) durante la creazione di una nuova attività. Specificando un rettangolo vuoto, l'app può essere ingrandita.

Ridimensionare le finestre

In ChromeOS, gli utenti possono ridimensionare la finestra di un'app nel solito modo: trascinando l'angolo in basso a destra, come mostrato nella figura 2.

Figura 2. Una finestra dell'app ridimensionabile.

Sono disponibili due opzioni per gestire il ridimensionamento delle finestre quando utilizzi la classe View:

  • Rispondere alle modifiche della configurazione in modo dinamico chiamando onConfigurationChanged(..). Ad esempio, puoi aggiungere android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" al manifest dell'attività. Per saperne di più sulla gestione delle modifiche alla configurazione, consulta Gestire le modifiche alla configurazione.
  • Consenti al sistema di riavviare l'attività. In questo caso, implementa onSaveInstanceState e utilizza il componente dell'architettura ViewModel per ripristinare lo stato salvato precedente.

Quando utilizzi Jetpack Compose, il comportamento di ridimensionamento dipende dalla configurazione dell'attività. Se gestisce le modifiche in modo dinamico, viene attivata una ricomposizione quando cambiano le dimensioni della finestra. Se l'attività viene riavviata dal sistema, dopo il riavvio si verifica una composizione iniziale. In ogni caso, è importante creare layout di Scrivi che si adattino alle dimensioni delle finestre variabili. Non presupporre dimensioni fisse.

Dimensioni finestra

Fai in modo che le tue attività leggano le dimensioni della finestra a ogni avvio e li dispongano dei contenuti in base alla configurazione corrente.

Per determinare la configurazione corrente, chiama getResources().getConfiguration() sull'attività in corso. Non utilizzare la configurazione dell'attività in background o della risorsa di sistema. L'attività in background non ha una dimensione e la configurazione del sistema potrebbe contenere più finestre con dimensioni e orientamenti in conflitto, pertanto non è possibile estrarre dati utilizzabili.

Tieni presente che le dimensioni della finestra e dello schermo non corrispondono. Per ottenere le dimensioni della finestra in DP, utilizza Activity.getResources().getConfiguration().screenWidth e Activity.getResources().getConfiguration().screenHeight. Probabilmente non avrai mai bisogno di usare le dimensioni dello schermo.

Limiti dei contenuti

I limiti dei contenuti di una finestra possono cambiare dopo il ridimensionamento. Ad esempio, l'area all'interno della finestra utilizzata dall'app può cambiare se la finestra diventa troppo grande per essere adattata allo schermo. Segui queste linee guida:

  • Le app che usano il processo di layout di Android vengono disposte automaticamente nello spazio disponibile.
  • Le app native devono leggere l'area disponibile e monitorare le variazioni delle dimensioni per evitare di avere elementi UI inaccessibili. Richiama i metodi seguenti per determinare le dimensioni iniziali disponibili per questa piattaforma:

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

    Il monitoraggio continuo può essere effettuato utilizzando un osservatore:

    • NativeActivity.onContentRectChangedNative()
    • NativeActivity.onGlobalLayout()
    • Aggiungi un listener a view.addOnLayoutChangeListener(findViewById(android.R.id.content))

    Se l'app sta prescalando la grafica, fallo ogni volta che la risoluzione cambia.

Ridimensionamento in formato libero

ChromeOS consente di ridimensionare liberamente qualsiasi finestra: l'utente può modificare la larghezza, l'altezza e la posizione di una finestra sullo schermo. Molte app Android sono scritte senza tenere conto del ridimensionamento in formato libero. Prendi in considerazione i seguenti aspetti:

  • La posizione dello schermo potrebbe cambiare. Utilizza sempre il sistema per eseguire trasformazioni di coordinate da finestra a schermo e da schermo a finestra.
  • Se usi il sistema di visualizzazione di Android, il layout delle finestre cambia automaticamente quando le sue dimensioni cambiano.
  • Se non utilizzi il sistema di visualizzazione e controlli la piattaforma, la tua app deve gestire autonomamente le modifiche alle dimensioni.
  • Per le app native, utilizza i membri mLastContent o la visualizzazione dei contenuti per determinare le dimensioni iniziali.
  • Quando l'app è in esecuzione, ascolta gli eventi onContentRectChangedNative o onGlobalLayout per reagire ai cambiamenti delle dimensioni.
  • Quando le dimensioni dell'app cambiano, ridimensiona o ricarica layout e artwork e aggiorna le aree di input.

Modalità a schermo intero

La modalità a schermo intero funziona come su Android stock. Se la finestra non copre l'intero schermo, le richieste di filtro completo (ovvero tutti gli elementi dell'interfaccia utente di sistema) vengono ignorate. Quando l'app viene ingrandita, vengono eseguiti i normali metodi a schermo intero, i layout e le funzioni. In questo modo, gli elementi dell'interfaccia utente di sistema (barra di controllo della finestra e barra delle app) vengono nascosti.

Orientamento dello schermo

L'orientamento più comune per un'app Android è verticale, dato che è così che viene applicata la maggior parte dei telefoni. Sebbene il formato verticale sia una buona soluzione per i telefoni, è terribile per i laptop e i tablet, dove è preferibile usare l'orientamento orizzontale. Per ottenere risultati ottimali per la tua app, valuta la possibilità di supportare entrambi gli orientamenti.

Alcune app per Android presuppongono che quando un dispositivo viene tenuto in modalità verticale, il valore di rotazione sia Surface.ROTATION_0. Questo potrebbe valere per la maggior parte dei dispositivi Android. Tuttavia, quando l'app è in una determinata modalità ARC, il valore di rotazione per l'orientamento verticale potrebbe non essere Surface.ROTATION_0.

Per ottenere un valore di rotazione preciso durante la lettura dell'accelerometro o di sensori simili, utilizza il metodo Display.getRotation() e scambia l'asse di conseguenza.

L'attività e l'orientamento principali

Una finestra di Chromebook è composta da una pila di finestre di attività. Ogni finestra nella pila ha le stesse dimensioni e lo stesso orientamento.

Le variazioni improvvise di orientamento e dimensioni possono creare confusione in un ambiente desktop. Gestione finestre di Chromebook evita questo problema in modo simile alla modalità affiancata di Android: l'attività nella parte inferiore della pila controlla gli attributi di tutte le attività in alto. Ciò può portare a situazioni impreviste, in cui un'attività appena iniziata che è verticale e non ridimensionabile diventa orizzontale e ridimensionabile.

La modalità dispositivo influisce qui: in modalità tablet, l'orientamento non è bloccato e ogni finestra mantiene il proprio orientamento, come accade normalmente su Android.

Linee guida per l'orientamento

Segui queste linee guida per gestire l'orientamento:

  • Se supporti un solo orientamento, aggiungi le informazioni al manifest in modo che il gestore di finestre ne sia a conoscenza prima di avviare l'applicazione. Quando specifichi l'orientamento, specifica anche gli orientamenti del sensore, se possibile. I Chromebook sono spesso convertibili e un'app capovolta rappresenta un'esperienza utente negativa.
  • Cerca di mantenere un singolo orientamento selezionato. Evita di richiedere un orientamento nel manifest e di impostarne un altro in modo programmatico in un secondo momento.
  • Fai attenzione a modificare l'orientamento in base alle dimensioni della finestra. L'utente potrebbe rimanere bloccato in una piccola finestra verticale e non essere in grado di tornare a una finestra orizzontale più grande.
  • In Chrome sono disponibili controlli delle finestre che consentono di passare da un layout all'altro. Scegliendo l'opzione di orientamento corretta, puoi assicurarti che l'utente abbia il layout corretto dopo l'avvio dell'app. Se un'app è disponibile in verticale e orizzontale, imposta l'orientamento predefinito su orizzontale, se possibile. Una volta impostata, questa opzione viene memorizzata per ogni app.
  • Cerca di evitare modifiche dell'orientamento non necessarie. Ad esempio, se l'orientamento dell'attività è verticale, ma l'app chiama setRequestedOrientation(LANDSCAPE) in fase di runtime, questo provoca un ridimensionamento delle finestre non necessario, fastidioso per l'utente e potrebbe riavviare l'app che l'app non è in grado di gestire. È meglio impostare l'orientamento una volta, ad esempio nel file manifest, e modificarlo solo se necessario.

Altre considerazioni

Di seguito sono riportati altri aspetti da considerare per l'utilizzo delle app Android in ChromeOS:

  • Non chiamare finish() nel metodo onDestroy dell'attività. In questo modo, l'app si chiude al momento del ridimensionamento e non viene riavviata.
  • Non utilizzare tipi di finestre non compatibili, come TYPE_KEYGUARD e TYPE_APPLICATION_MEDIA.
  • Accelera il riavvio dell'attività memorizzando nella cache gli oggetti allocati in precedenza.
  • Se non vuoi che l'utente ridimensioni l'app, specifica android:resizeableActivity=false nel file manifest.
  • Testa l'app per assicurarti che gestisca le modifiche alle dimensioni della finestra in modo appropriato.