Orientamento dell'app limitato sugli smartphone, ma non sugli schermi di grandi dimensioni

Icona di valutazione con due stelle

La tua app funziona perfettamente sugli smartphone in orientamento verticale, quindi l'hai limitata a questo orientamento. Tuttavia, vedi l'opportunità di fare di più sugli schermi grandi in orientamento orizzontale.

Come puoi fare entrambe le cose: limitare l'app all'orientamento verticale sugli schermi piccoli, ma consentire l'orientamento orizzontale su quelli grandi?

Best practice

Le app migliori rispettano le preferenze degli utenti, ad esempio l'orientamento del dispositivo.

Le linee guida sulla qualità delle app adattive consigliano di supportare tutte le configurazioni dei dispositivi, inclusi gli orientamenti verticale e orizzontale, la modalità multi-finestra e gli stati piegato e aperto dei dispositivi pieghevoli. Le app devono ottimizzare i layout e le interfacce utente per le diverse configurazioni, nonché salvare e ripristinare lo stato durante le modifiche alla configurazione.

Questa ricetta è una misura temporanea: un pizzico di supporto per schermi grandi. Utilizzala finché non puoi migliorare la tua app per fornire il supporto completo per tutte le configurazioni dei dispositivi.

Ingredienti

  • screenOrientation: impostazione del file manifest dell'app che consente di specificare in che modo l'app risponde alle modifiche dell'orientamento del dispositivo
  • Activity#setRequestedOrientation(): metodo con cui puoi modificare l'orientamento dell'app in fase di runtime
  • LocalConfiguration: provider locale componibile che espone la corrente del dispositivo Configuration, consentendoti di leggere le dimensioni dello schermo in dp.
  • LaunchedEffect: API di effetti collaterali di Compose che esegue un blocco di codice quando una chiave cambia (in questo caso, quando la configurazione cambia).

Passaggi

Consenti all'app di gestire le modifiche dell'orientamento per impostazione predefinita nel file manifest dell'app. Poi, in fase di runtime, utilizza Jetpack Compose per limitare dinamicamente l'orientamento a quello verticale sugli schermi compatti (smartphone), consentendo al contempo tutti gli orientamenti sugli schermi grandi.

1. Specifica l'impostazione dell'orientamento nel file manifest dell'app

Puoi evitare di dichiarare l'elemento screenOrientation del file manifest dell'app (nel qual caso l'orientamento predefinito è unspecified) o impostare l'orientamento dello schermo su fullUser. Se l'utente non ha bloccato la rotazione basata sul sensore, la tua app supporterà tutti gli orientamenti del dispositivo.

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

La differenza tra l'utilizzo di unspecified e fullUser è sottile ma importante. Se non dichiari un valore screenOrientation, il sistema sceglie l'orientamento e la policy utilizzata dal sistema per definire l'orientamento potrebbe variare da dispositivo a dispositivo. D'altra parte, la specifica di fullUser corrisponde più da vicino al comportamento definito dall'utente per il dispositivo: se l'utente ha bloccato la rotazione basata sul sensore, l'app segue la preferenza dell'utente; in caso contrario, il sistema consente uno dei quattro orientamenti dello schermo possibili (verticale, orizzontale, verticale inverso o orizzontale inverso). Consulta android:screenOrientation.

2. Limita dinamicamente l'orientamento in Compose

In Jetpack Compose, puoi leggere le dimensioni dello schermo correnti in dp in modo reattivo da LocalConfiguration.current e utilizzare un LaunchedEffect per aggiornare l'orientamento dell'attività ogni volta che la configurazione cambia.

Se la larghezza o l'altezza dello schermo è inferiore a 600dp (corrispondente al punto di interruzione compatto per gli smartphone), limita l'orientamento a quello verticale. In caso contrario, consenti al sistema di ruotare l'app in base alla preferenza dell'utente (unspecified o fullUser).

Di seguito è riportata l'implementazione completa e compilabile:

val configuration = LocalConfiguration.current
val context = LocalActivity.current

LaunchedEffect(configuration) {
    val activity = context ?: return@LaunchedEffect
    // Determine if screen is compact (phone-sized) in either width or height
    val isCompact = configuration.screenWidthDp < 600 || configuration.screenHeightDp < 600
    activity.requestedOrientation = if (isCompact) {
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
    } else {
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    }
}

Aggiungendo la logica all'interno di un blocco LaunchedEffect(configuration), puoi sostituire in modo reattivo l'impostazione dell'orientamento ogni volta che la configurazione dell'app cambia, ad esempio quando l'attività viene ridimensionata, spostata tra i display o quando un dispositivo pieghevole viene piegato o aperto.

Per ulteriori informazioni su quando si verificano le modifiche alla configurazione e quando causano la ricreazione dell'attività, consulta Gestire le modifiche alla configurazione.

Risultati

Ora l'app dovrebbe rimanere in orientamento verticale sugli schermi piccoli, indipendentemente dalla rotazione del dispositivo. Sugli schermi grandi, l'app dovrebbe supportare gli orientamenti orizzontale e verticale.

Risorse aggiuntive

Per assistenza con l'upgrade dell'app per supportare sempre tutte le configurazioni dei dispositivi, consulta: