2011-01-13 21 views
125

Eventuali duplicati:
How to disable orientation change in Android?blocco orientamento dello schermo (Android)

Sto scrivendo un'applicazione Android che utilizza le schede con contenuti diversi (attività). In una di queste attività, desidero bloccare l'orientamento dello schermo in modalità "Paesaggio", ma nelle altre attività, desidero l'orientamento normale (in base al sensore).

Quello che sto facendo ora è che sto chiamando

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

quando passo all'attività modalità orizzontale, e

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

quando passo indietro alle altre attività. Tuttavia, questo non sembra funzionare, l'intera applicazione si blocca. Qual è l'approccio normale a questo problema?

+14

Il collegamento "Possibile duplicato" è ** non ** una domanda duplicata a questo. Questa domanda chiede come ** bloccare l'orientamento ** in modo che non possa cambiare da orizzontale. La domanda collegata chiede come ** impedire il riavvio dell'applicazione ** quando cambia l'orientamento. – Kent

+0

Questo sembra essere quello che vuoi: chiama 'Screen.lockOrientation (this)' e in seguito 'Screen.unlockOrientation (this)' da https://github.com/delight-im/Android-BaseLib/blob/master/Source /src/im/delight/android/baselib/Screen.java – caw

+0

Solo un'attenzione però, se si utilizza ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT in linea, questo non è consentito al di sotto 4.3. È quindi possibile utilizzare sopra o ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT – Akshay

risposta

218

Nel Manifest, è possibile impostare lo schermoOrientazione in orizzontale. Sembrerebbe qualcosa di simile nel XML:

<activity android:name="MyActivity" 
android:screenOrientation="landscape" 
android:configChanges="keyboardHidden|orientation|screenSize"> 
... 
</activity> 

Dove MyActivity è quello che si vuole rimanere nel paesaggio.

La riga android:configChanges=... impedisce di chiamare onResume(), onPause() quando lo schermo viene ruotato. Senza questa linea, la rotazione rimarrà come richiesto ma le chiamate verranno comunque effettuate.

Nota: keyboardHidden e orientation sono necessari per < Android 3.2 (API di livello 13), e tutte e tre le opzioni sono tenuti 3.2 o superiore, non solo orientation.

+0

Non sembra funzionare; mi sto perdendo qualcosa? – user573536

+3

Hmm sì, hai ragione che non sembra funzionare se l'attività è in esecuzione all'interno di un TabHost. Penso che potresti avere l'idea giusta usando 'setRequestedOrientation', ma prova a mettere la chiamata in' onResume', * not * 'onCreate', e nell'attività non-landscape usa' ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED' invece di 'SENSOR'. Anche il mio emulatore ha funzionato con il sensore, ma il lavoro non specificato ha funzionato –

+0

c'è un modo per definire l'orientamento per il servizio ... in sostanza scrivo un servizio LiveWallpaper ... dove è necessario limitare l'orientamento del dispositivo. – CoDe

52

Ho avuto un problema simile.

quando sono entrato

<activity android:name="MyActivity" android:screenOrientation="landscape"></activity> 

Nel file manifest questo ha causato che l'attività per visualizzare nel paesaggio. Tuttavia, quando sono tornato alle attività precedenti, sono stati visualizzati in panoramiche anche se erano impostati su Ritratto. Tuttavia aggiungendo

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

immediatamente dopo che la sezione OnCreate dell'attività di destinazione ha risolto il problema. Quindi ora uso entrambi i metodi.

+1

Solo un'attenzione però, se si sta utilizzando ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT, questo non è consentito al di sotto 4.3. È quindi possibile utilizzare sopra o ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT – Akshay

+0

Avviso: l'utilizzo di setRequestedOrientation() farà riavviare l'attività, attivando onResume ecc due volte. Aggiungi questo al tuo manifest per ogni attività in cui lo fai per evitarlo: android: configChanges = "keyboardHidden | orientation | screenSize" – bluehallu

27

all'interno del file manifest di Android del progetto, trovare la Dichiarazione di attività di cui si desidera correggere l'orientamento e aggiungere il seguente pezzo di codice,

android:screenOrientation="landscape" 

per l'orientamento orizzontale e per il ritratto aggiungere il seguente codice ,

android:screenOrientation="portrait" 
Problemi correlati