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

Icona di valutazione a due stelle

La tua app funziona perfettamente sugli smartphone con orientamento verticale, quindi hai limitato l'app solo a questo orientamento. Tuttavia, vedi un'opportunità per fare di più sugli schermi di grandi dimensioni con orientamento orizzontale.

Come puoi ottenere entrambi i risultati, ovvero limitare l'app all'orientamento verticale sugli schermi piccoli, ma abilitare l'orientamento orizzontale su quelli grandi?

Best practice

Le app migliori rispettano le preferenze dell'utente, ad esempio l'orientamento del dispositivo.

Le norme sulla qualità delle app adattive consigliano alle app di supportare tutte le configurazioni dei dispositivi, inclusi gli orientamenti verticale e orizzontale, la modalità multi-finestra e gli stati di apertura e chiusura 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 potrai migliorare la tua app per fornire il supporto completo per tutte le configurazioni dei dispositivi.

Ingredienti

  • screenOrientation: impostazione del file manifest dell'app che ti 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 il dispositivo corrente Configuration, consentendoti di leggere le dimensioni dello schermo in DP.
  • LaunchedEffect: API Compose per gli effetti collaterali che esegue un blocco di codice quando una chiave cambia (in questo caso, quando cambia la configurazione).

Passaggi

Abilita l'app per 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 alla modalità verticale sugli schermi compatti (smartphone), consentendo al contempo tutti gli orientamenti sugli schermi di grandi dimensioni.

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

Puoi evitare di dichiarare l'elemento screenOrientation del manifest dell'app (in questo caso l'orientamento predefinito è unspecified) o impostare l'orientamento dello schermo su fullUser. Se l'utente non ha bloccato la rotazione basata su 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 la policy utilizzata dal sistema per definire l'orientamento potrebbe variare da dispositivo a dispositivo. D'altra parte, specificando fullUser, il comportamento corrisponde più da vicino a quello definito dall'utente per il dispositivo: se l'utente ha bloccato la rotazione basata sui sensori, l'app segue la preferenza dell'utente; in caso contrario, il sistema consente uno dei quattro possibili orientamenti dello schermo (verticale, orizzontale, verticale inverso o orizzontale inverso). Consulta android:screenOrientation.

2. Limita dinamicamente l'orientamento in Compose

In Jetpack Compose, puoi leggere le dimensioni attuali dello schermo 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 alla modalità 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 dell'impostazione di orientamento in modo reattivo 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 Gestisci le modifiche alla configurazione.

Risultati

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

Risorse aggiuntive

Per assistenza sull'upgrade della tua app per supportare tutte le configurazioni dei dispositivi in qualsiasi momento, consulta quanto segue: