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 dispositivoActivity#setRequestedOrientation(): metodo con cui puoi modificare l'orientamento dell'app in fase di runtimeLocalConfiguration: fornitore locale componibile che espone l'attualeConfigurationdel 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:
- Supportare diverse dimensioni dello schermo
- Gestire le modifiche alla configurazione
- Salvare gli stati dell'interfaccia utente