Forza la modalità di orientamento "verticale"


298

Sto cercando di forzare la modalità "verticale" per la mia applicazione perché la mia applicazione non è assolutamente progettata per la modalità "orizzontale".

Dopo aver letto alcuni forum, ho aggiunto queste righe nel mio file manifest:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Ma non funziona sul mio dispositivo (HTC Desire). Passa da "portrait" lo "landscape", ignorando le linee del file manifest.

Dopo aver letto più forum, ho provato ad aggiungere questo nel mio file manifest:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

e questa funzione nella mia classe di attività:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Ma ancora una volta, senza fortuna.

Risposte:


531

Non applicare l'orientamento all'elemento dell'applicazione , invece devi applicare l'attributo all'elemento attività e devi anche impostare configChangescome indicato di seguito.

Esempio:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Questo viene applicato nel file manifest AndroidManifest.xml.


26
A cosa servono i configChanges?
Dror,

71
@Orchestrator, configChanges significa che la modifica della configurazione è gestita dall'attività stessa. Senza di essa, l'attività verrà riavviata in caso di modifica dell'orientamento. Potresti chiedere, se hai specificato che l'orientamento è "ritratto" come cambierebbe mai? Può cambiare se avvii un'altra attività che altera l'orientamento, quindi esce quella nuova attività, riportandoti alla tua attività. Ad esempio, l'intento predefinito di acquisizione delle immagini sul Samsung Galaxy S3 lo fa in determinati orientamenti.
Gordon McCreight,

2
@GordonMcCreight, puoi per favore spiegarlo con un vero esempio "Potresti chiedere, se hai specificato che l'orientamento è" ritratto "come cambierebbe? Può cambiare se avvii un'altra attività che altera l'orientamento, quindi che esce una nuova attività, che ti riporta alla tua attività ".
Tushar Pandey,

3
Certo, @TusharPandey. Se ricordo bene, l'unico posto che ci ha causato dolore è stato quando la nostra attività ha lanciato l'intento di acquisizione delle immagini predefinito sul Samsung Galaxy S3. Fondamentalmente, volevamo solo fare una foto e ottenere i risultati. Tuttavia, quando l'intento della fotocamera è tornato, ha causato un cambiamento di orientamento che ha spazzato via lo stato nella nostra attività, dal momento che non credevamo di dover proteggere da ciò (dato che la nostra intera app era sempre e solo in orientamento "verticale"). Come e perché il Galaxy S3 fa questo va oltre la mia comprensione (certamente limitata).
Gordon McCreight,

8
Perché è incluso "keyboardHidden"?
gonzobrains,

24

Nota che

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

viene aggiunto nel file manifest - dove viene definita l'attività.


13

Penso che android:screenOrientation="portrait"possa essere utilizzato per singole attività. Quindi usa quell'attributo nel <activity>tag come:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>

13

Se hai molte attività come la mia, nella tua applicazione O se non vuoi inserire il codice per ogni tag di attività in manifest puoi farlo.

nella tua classe Application Base otterrai una richiamata del ciclo di vita

quindi in pratica ciò che accade per ogni attività durante la creazione di on create in Application Class viene attivato qui è il codice ..

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

Spero che aiuti.


1
Risposta efficiente! questa dovrebbe essere la risposta corretta, soprattutto per coloro che stanno sviluppando app complesse che dipendono fortemente da un gran numero di attività.
FEBRYAN ASA PERDANA,

10

Impostare la modalità verticale o orizzontale forzata , rispettivamente aggiungere linee.

Importa sotto la riga:

import android.content.pm.ActivityInfo;

Aggiungi sotto la linea appena sopra setContentView(R.layout.activity_main);

Per ritratto :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Per il paesaggio :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Funzionerà sicuramente.


1
Questo non funziona con Android 9 su alcuni dispositivi - la transizione di rotazione dello schermo è visibile per un breve momento anche se usi solo RITRATTO
Igor Wojda

Potete per favore specificare le informazioni sul dispositivo in cui avete affrontato questo, se possibile
Parth Patel

4

Secondo la documentazione di Android, dovresti anche includere spesso screenSizecome possibile modifica della configurazione.

android:configChanges="orientation|screenSize"

Se l'applicazione è indirizzata al livello API 13 o superiore (come dichiarato dagli attributi minSdkVersion e targetSdkVersion), è necessario dichiarare anche la configurazione "screenSize", poiché cambia anche quando un dispositivo passa da orientamento verticale a orizzontale.

Inoltre, se si sono tutte dotate di valore keyboardHiddennei tuoi esempi, non dovrebbe allora anche prendere in considerazione locale, mcc, fontScale, keyboarde gli altri? ..


3

Ho avuto questa linea nel mio AndroidManifest.xml

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Che ho cambiato in (appena aggiunto android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Questo ha risolto le cose per me.


2

Qualcosa da completare: di recente ho aggiornato un'app, la precedente funzionava sia in modalità orizzontale che verticale e voglio che la versione aggiornata funzionasse in modalità verticale, quindi ho aggiunto

android:screenOrientation="portrait"

all'attività corrispondente e si è arrestato in modo anomalo quando ho verificato l'aggiornamento. Poi ho aggiunto

android:configChanges="orientation|keyboardHidden"

anche, e funziona.


1
Se questa non è una risposta alla domanda, è possibile aggiungerla come commento potrebbe aiutare.
JPReddy,

Verifica di averlo aggiunto all'attività non per il blocco applicazione
Waran-

1

Penso che tu voglia aggiungere android:configChanges="orientation|keyboardHidden"alla tua attività? Altrimenti l'attività viene riavviata al momento della modifica della configurazione. Il onConfigurationChangednon sarebbe chiamato allora, solo ilonCreate


1

Se desideri supportare diversi orientamenti debuge releasebuild, scrivilo (vedi https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

Nella build.gradletua appcartella scrivi:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Quindi AndroidManifestpuoi usare questa variabile "orientamento" in qualsiasi Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Puoi aggiungere android:configChanges :

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]in debug e manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]in rilascio,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />

-8

Risposta breve: non farlo.

Riprogetta l'app in modo che possa essere eseguita sia in modalità verticale che orizzontale. Non esiste un'interfaccia utente che non possa essere progettata per funzionare sia in verticale che in orizzontale; solo sviluppatori pigri o privi di fantasia.

Il motivo è piuttosto semplice. Desideri che la tua app sia utilizzabile da un pubblico il più ampio possibile su quanti più dispositivi possibili. Forzando un particolare orientamento dello schermo, si impedisce l'esecuzione (usabile) della propria app su dispositivi che non supportano tale orientamento e si frustrano e alienano i potenziali clienti che preferiscono un orientamento diverso.

Esempio: si progetta l'app per forzare la modalità verticale. Un cliente scarica l'app su un dispositivo 2 in 1 che utilizza prevalentemente in modalità orizzontale.
Conseguenza 1: l'app è inutilizzabile o il cliente è costretto a sganciare il proprio dispositivo, ruotarlo e utilizzarlo con un orientamento che non è familiare o comodo per loro.
Conseguenza 2: il cliente è frustrato dal design non intuitivo della tua app e trova un'alternativa o elimina completamente l'app.

Sto combattendo con questo con un'app in questo momento e come consumatore e sviluppatore, lo odio. Per quanto utile sia l'app, fantastica quanto le funzionalità che offre, odio assolutamente l'app perché mi costringe a usare un orientamento contrario a ogni altro modo in cui uso il mio dispositivo.

Non vuoi che i tuoi clienti odino la tua app.


So che questo non risponde direttamente alla domanda, quindi voglio spiegarlo in modo un po 'più dettagliato per coloro che sono curiosi.

C'è una tendenza per gli sviluppatori a essere davvero bravi a scrivere codice e davvero terribili nella progettazione. Questa domanda, sebbene sembri una domanda di codice e il richiedente certamente si sente come una domanda di codice, è davvero una domanda di progettazione.

La domanda è davvero "Devo bloccare l'orientamento dello schermo nella mia app?" Il richiedente ha scelto di progettare l'interfaccia utente affinché funzioni e abbia un bell'aspetto solo in modalità verticale. Ho il sospetto che fosse per risparmiare tempo di sviluppo o perché il flusso di lavoro dell'app è particolarmente favorevole a un layout verticale (comune per i giochi mobili). Ma questi motivi trascurano tutti i fattori veramente importanti che motivano il design corretto.

  1. Coinvolgimento dei clienti: vuoi che i tuoi clienti si sentano attratti dalla tua app, non da cui vengano spinti fuori. L'app dovrebbe passare senza problemi da qualsiasi cosa il cliente stia facendo prima di aprire l'app. (Questo è il motivo per cui la maggior parte delle piattaforme ha principi di progettazione coerenti, quindi la maggior parte delle app si assomigliano più o meno allo stesso modo in cui non è necessario.)

  2. Risposta del cliente: vuoi che i tuoi clienti reagiscano positivamente alla tua app. Dovrebbero divertirsi ad usarlo. Anche se è un'app per le buste paga per lavoro, dovrebbe essere un piacere per loro aprirla e fare il login. L'app dovrebbe far risparmiare tempo ai tuoi clienti e ridurre la frustrazione per le alternative. (Le app che infastidiscono gli utenti generano risentimento nei confronti della tua app che diventa risentimento nei confronti del tuo marchio.)

  3. Conversione dei clienti: desideri che i tuoi clienti possano passare rapidamente e facilmente dalla navigazione all'interazione. Questo è l'obiettivo finale di qualsiasi app, convertire le impressioni in entrate. (Le app che non generano entrate sono una perdita di tempo per la creazione, dal punto di vista aziendale.)

Un'interfaccia utente mal progettata riduce il coinvolgimento e la risposta dei clienti, con conseguente conseguente riduzione delle entrate. In un mondo incentrato sui dispositivi mobili (e in particolare per quanto riguarda le modalità di visualizzazione verticale / orizzontale), questo spiega perché il web design reattivo è un grosso problema. Walmart Canada ha introdotto il design reattivo sul proprio sito Web nel novembre 2013 e ha registrato un aumento del 20% nella conversione dei clienti. O'Neill Clothing ha implementato il web design reattivo e le entrate dei clienti che utilizzano dispositivi iOS sono aumentate del 101,25% e del 591,42% dai clienti che utilizzano dispositivi Android .

C'è anche la tendenza degli sviluppatori a concentrarsi intensamente sull'implementazione di una particolare soluzione (come bloccare l'orientamento del display) e la maggior parte degli sviluppatori su questo sito sarà fin troppo contenta di aiutare a implementare quella soluzione, senza mettere in discussione se sia la migliore soluzione al problema.

Il blocco dell'orientamento dello schermo equivale alla progettazione dell'interfaccia utente dell'implementazione di un ciclo Do-while. Sei davvero sicuro di voler farlo in questo modo o esiste un'alternativa migliore?

Non forzare l'app in un'unica modalità di visualizzazione. Investi il ​​tempo e gli sforzi extra per renderlo reattivo.


2
Comprendo e concordo con te sul fatto che si tratta di un'interfaccia utente mal progettata. Ma ciò non cambia il fatto che POTREBBE AVERE BISOGNO di farlo, e tuttavia il framework dovrebbe avere tali capacità, in generale. Non si sa mai come saranno e come dovranno essere le app future, quindi la domanda è ancora valida.
Z. Khullah,

1
Tu non hai torto. Penso che la mia risposta sia stata in parte alimentata dalla frustrazione che ho con alcune app che lo fanno inutilmente e rovina completamente l'esperienza. Dirò che il numero di casi legittimi per bloccare la modalità di visualizzazione è infinitamente piccolo (e comunque fattibile e preferibile, non entro il budget). Questo ricorda altri problemi; con la codifica che diventa più semplice che mai ci sono molti sviluppatori amatoriali che scrivono app perché conoscono il codice ma senza imparare come fare l'interfaccia utente o progettare, o persino le migliori pratiche di base (app Java installate in \ AppData - EWWWW).
Thomas,

1
Sto costruendo un'app VR. L'orientamento DEVE ESSERE paesaggio per gli occhiali per fare la loro magia. Questo è un esempio di un'interfaccia utente che non può essere progettata per funzionare sia in verticale che in orizzontale. Inoltre, i giochi potrebbero dover forzare un certo orientamento. Scommetto che ci sono tonnellate di casi legittimi.
Raslanove,

1
Mentre StackExchange esiste per rispondere a domande specifiche, le risposte devono essere scritte per essere applicate nel modo più generale possibile in modo che tali risposte siano utili ad altri. Lo sviluppo è molto più che scrivere semplicemente codice e il motivo per cui ci sono così tante applicazioni spazzatura nel mondo è perché così tanti sviluppatori dimenticano o non imparano mai questo importante principio. Aggiungerei personalmente che se stai realizzando la realtà virtuale su un telefono, stai facendo la realtà virtuale sbagliata, ma il costo ha spinto la domanda di realtà virtuale su piattaforme che non dovrebbero mai supportarla.
Thomas,

1
Non sono d'accordo con questa risposta, ma sta rispondendo a una domanda che non è stata posta.
bmovement
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.