Gestione delle finestre

ChromeOS supporta le app per Android in più finestre. Il sistema esegue il rendering delle app in contenitori finestra la cui dimensione è determinata dal fattore di forma del dispositivo, come mostrato nella figura 1.

Una finestra dell'app su dispositivi diversi.
Figura 1.: La didascalia va qui.

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

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

Questa pagina mostra come fare in modo che la finestra dell'app venga avviata correttamente, ridimensionata senza problemi e visualizzi tutti i suoi contenuti quando le dimensioni cambiano.

Dimensioni di lancio iniziali

Le app possono richiedere le dimensioni di lancio iniziali nei seguenti modi:

  • Utilizza una dimensione di lancio solo negli ambienti desktop. In questo modo, il gestore finestre può fornirti i limiti e l'orientamento corretti. Per indicare una preferenza quando viene utilizzata in modalità desktop, aggiungi i seguenti meta tag all'interno di <activity>:

    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowSize&#34;
               android:value=&#34;[phone|tablet|maximize]&#34; /&gt;
    &lt;meta-data android:name=&#34;WindowManagerPreference:FreeformWindowOrientation&#34;
               android:value=&#34;[portrait|landscape]&#34; /&gt;
    
  • Utilizza limiti di lancio statici. Utilizza <layout> all'interno della voce del manifest della tua attività per specificare una dimensione iniziale "fissa", come nel seguente esempio:

    &lt;layout android:defaultHeight=&#34;500dp&#34;
                android:defaultWidth=&#34;600dp&#34;
                android:gravity=&#34;top|end&#34;
                android:minHeight=&#34;450dp&#34;
                android:minWidth=&#34;300dp&#34; /&gt;
    
  • Utilizza limiti di lancio dinamici. Un'attività può creare e utilizzare ActivityOptions.setLaunchBounds(Rect) quando viene creata una nuova attività. Se specifichi un rettangolo vuoto, la tua app può essere massimizzata.

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.: La didascalia va qui.

Figura 2. Una finestra dell'app ridimensionabile.

Esistono due opzioni per la gestione del ridimensionamento della finestra quando utilizzi la classe View:

  • Rispondere dinamicamente alle modifiche alla configurazione chiamando onConfigurationChanged(..). Ad esempio, puoi aggiungere android:configChanges="screenSize|smallestScreenSize|orientation|screenLayout" al manifest dell'attività. Per ulteriori informazioni sulla gestione delle modifiche alla configurazione, leggi Gestione delle 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 precedente salvato.

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

Dimensioni della finestra

Le attività leggono le dimensioni della finestra ogni volta che vengono avviate e dispongono i contenuti in base alla configurazione corrente.

Per determinare la configurazione attuale, chiama getResources().getConfiguration() nell'attività corrente. 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, quindi non è possibile estrarre dati utilizzabili.

Tieni presente che le dimensioni della finestra e dello schermo non sono le stesse. Per ottenere le dimensioni della finestra in DP, utilizza Activity.getResources().getConfiguration().screenWidth e Activity.getResources().getConfiguration().screenHeight. Probabilmente non dovrai mai utilizzare 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 visualizzata sullo schermo. Segui queste linee guida:

  • Le app che utilizzano la procedura di layout di Android vengono disposte automaticamente nello spazio disponibile.
  • Le app native devono leggere l'area disponibile e monitorare le modifiche alle dimensioni per evitare di avere elementi dell'interfaccia utente inaccessibili. Chiama i seguenti metodi per determinare le dimensioni iniziali disponibili per questa superficie:

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

    Il monitoraggio continuo può essere eseguito utilizzando un osservatore:

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

    Se l'app esegue il pre-scaling della 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 per Android sono scritte senza tenere conto del ridimensionamento in formato libero. Considera questi problemi:

  • La posizione dello schermo potrebbe cambiare. Utilizza sempre il sistema per eseguire le trasformazioni delle coordinate da finestra a schermo e da schermo a finestra.
  • Se utilizzi il sistema di visualizzazione di Android, il layout della finestra cambia automaticamente quando le dimensioni cambiano.
  • Se non utilizzi il sistema di visualizzazione e prendi il controllo della superficie, 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 la dimensione iniziale.
  • Quando l'app è in esecuzione, ascolta gli eventi onContentRectChangedNative o onGlobalLayout per reagire alle modifiche delle dimensioni.
  • Quando le dimensioni dell'app cambiano, ridimensiona o ricarica i layout e le illustrazioni 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 visualizzazione a schermo intero (nascondendo tutti gli elementi dell'interfaccia utente di sistema) vengono ignorate. Quando l'app è ingrandita, vengono eseguite le normali funzioni, i layout e i metodi a schermo intero. In questo modo vengono nascosti gli elementi dell'interfaccia utente del sistema (barra di controllo della finestra e shelf).

Orientamento dello schermo

L'orientamento più comune per un'app per Android è verticale, perché è così che vengono tenuti la maggior parte degli smartphone. La modalità verticale è adatta agli smartphone, ma non ai laptop e ai tablet, per i quali è preferibile la modalità orizzontale. Per ottenere i risultati migliori 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 accurato 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 è costituita da una pila di finestre di attività. Ogni finestra nella pila ha le stesse dimensioni e lo stesso orientamento.

I cambiamenti improvvisi di orientamento e dimensioni sono fonte di confusione in un ambiente desktop. Il gestore finestre di Chromebook evita questo problema in modo simile alla modalità affiancata di Android: l'attività nella parte inferiore dello stack controlla gli attributi di tutte le attività sopra. Ciò può portare a situazioni inaspettate in cui un'attività appena avviata in modalità verticale e non ridimensionabile diventa orizzontale e ridimensionabile.

La modalità dispositivo ha un effetto qui: in modalità tablet, l'orientamento non è bloccato e ogni finestra mantiene il proprio orientamento, come di consueto su Android.

Linee guida per l'orientamento

Segui queste linee guida per la gestione dell'orientamento:

  • Se supporti una sola orientamento, aggiungi le informazioni al manifest in modo che il gestore 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 è una pessima esperienza utente.
  • Prova a mantenere una sola orientamento selezionato. Evita di richiedere un orientamento nel manifest e di impostarne un altro a livello di programmazione 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 in formato verticale e non riuscire a tornare a una finestra più grande in formato orizzontale.
  • In Chrome sono disponibili controlli della finestra per passare da un layout all'altro. Se scegli 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, impostala come predefinita in orizzontale, se possibile. Una volta impostata questa opzione, viene memorizzata per ogni app.
  • Cerca di evitare modifiche non necessarie dell'orientamento. Ad esempio, se l'orientamento dell'attività è verticale, ma l'app chiama setRequestedOrientation(LANDSCAPE) in fase di runtime, ciò causa un ridimensionamento non necessario della finestra, che è fastidioso per l'utente e potrebbe riavviare l'app se non riesce a gestirlo. È meglio impostare l'orientamento una sola volta, ad esempio nel manifest, e modificarlo solo se necessario.

Altre considerazioni

Ecco alcuni altri aspetti da considerare quando utilizzi le app per Android in ChromeOS:

  • Non chiamare finish() nel metodo onDestroy dell'attività. In questo modo, l'app si chiude al ridimensionamento e non si riavvia.
  • Non utilizzare tipi di finestre non compatibili, come TYPE_KEYGUARD e TYPE_APPLICATION_MEDIA.
  • Rendi veloci i riavvii delle attività memorizzando nella cache gli oggetti allocati in precedenza.
  • Se non vuoi che l'utente ridimensioni la tua app, specifica android:resizeableActivity=false nel file manifest.
  • Testa la tua app per assicurarti che gestisca correttamente le modifiche alle dimensioni della finestra.