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

Icona di valutazione con due stelle

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

Come puoi fare in modo che l'app sia limitata all'orientamento verticale sugli schermi piccoli, ma che sia possibile 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 per la qualità adattiva delle app consigliano alle app 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 diverse configurazioni e devono salvare e ripristinare lo stato durante le modifiche alla configurazione.

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

Ingredienti

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

Passaggi

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

1. Specificare l'impostazione dell'orientamento nel manifest dell'app

Puoi evitare di dichiarare l'elemento screenOrientation del 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 sui sensori, 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 le norme che utilizza per definirlo potrebbero variare da dispositivo a dispositivo. D'altra parte, specificare 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 qualsiasi dei quattro possibili orientamenti dello schermo (verticale, orizzontale, verticale inverso o orizzontale inverso). Consulta android:screenOrientation.

2. Limitare dinamicamente l'orientamento in Composizione

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 breakpoint compatto per gli smartphone), limita l'orientamento a verticale. In caso contrario, consenti al sistema di ruotare l'app in base alle preferenze dell'utente (unspecified o fullUser).

Ecco 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 eseguire l'override reattivo dell'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 di grandi dimensioni, l'app deve supportare gli orientamenti orizzontale e verticale.

Risorse aggiuntive

Per assistenza con l'upgrade dell'app in modo che supporti sempre tutte le configurazioni dei dispositivi, consulta quanto segue: