2010-01-27 20 views
118

Sto utilizzando il visualizzatore Android VNC sul mio HTC G1. Ma per qualche ragione, quell'applicazione è sempre in modalità orizzontale nonostante il mio G1 sia in modalità verticale. Dal momento che il visualizzatore VNC di Android è open source, vorrei sapere come è possibile che l'attività di hard code sia "landscape". Vorrei cambiarlo per rispettare l'orientamento del telefono.Forzare un'attività Android per utilizzare sempre la modalità orizzontale

risposta

28

È possibile specificare l'orientamento di un'attività nel manifesto. Vedi here.

<activity android:allowTaskReparenting=["true" | "false"] 
... 
      android:screenOrientation=["unspecified" | "user" | "behind" | 
            "landscape" | "portrait" | 
            "sensor" | "nosensor"] 
... 
             "adjustResize", "adjustPan"] > 
109

È possibile impostare gli stessi dati anche nel codice java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Altri valori su ActivityInfo consentiranno di reimpostarlo su ritratto guidato da sensore o bloccato. Personalmente, mi piace impostarlo su qualcosa nel Manifesto come suggerito in un'altra risposta a questa domanda e poi cambiarlo in seguito utilizzando la chiamata sopra nell'SDK di Android se ce n'è bisogno.

+9

Sebbene funzioni, forza il riavvio dell'attività. – Yegor

166

Guardando l'AndroidManifest.xml (link), sulla linea 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity"> 

Questa riga specifica il screenOrientation come paesaggio, ma l'autore si spinge oltre nel ignorando qualsiasi orientamento dello schermo cambia con configChanges="orientation|keyboardHidden". Ciò indica una funzione sovrascritta in VncCanvasActivity.java.

Se si guarda a VncCanvasActivity, sulla linea 109 è la funzione overrided:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // ignore orientation/keyboard change 
    super.onConfigurationChanged(newConfig); 
} 

L'autore specificamente mettere un commento a ignorare le modifiche della tastiera o di orientamento.


Se si desidera modificare questo, si può tornare al file AndroidManifest.xml mostrato sopra, e cambiare la linea:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity"> 

Questo dovrebbe cambiare il programma per passare da verticale a paesaggio quando l'utente ruota il dispositivo.

Questo potrebbe funzionare, ma potrebbe rovinare l'aspetto della GUI, a seconda di come è stato creato il layout. Dovrai tenerne conto. Inoltre, a seconda di come sono codificate le attività, è possibile notare che quando si modifica l'orientamento dello schermo, i valori che sono stati riempiti in qualsiasi casella di input scompaiono. Anche questo potrebbe dover essere gestito.

+2

Perché è necessario l'attributo 'configChanges'? Sembra che funzioni sul mio telefono senza tastiera ... In quali situazioni l'orientamento cambierà in portrait se hai 'screenOrientation =" landscape "' ma ometti 'configChanges'? – Timmmm

+0

nelle nuove versioni dovresti specificare anche screenSize: ['Se la tua applicazione ha come target API di livello 13 o superiore (come dichiarato dagli attributi minSdkVersion e targetSdkVersion), devi anche dichiarare la configurazione" screenSize ", perché cambia anche quando un dispositivo passa da un orientamento verticale a uno orizzontale.]] (http://developer.android.com/guide/topics/manifest/activity-element.html) – Cel

+0

come forzare un'attività incorporata come l'immagine di sistema seleziona la libreria solo in orizzontale o solo ritratto? – Jacky

3

Arslan, perché vuoi forzare l'orientamento pro grammaticalmente, anche se c'è già un modo di manifestare <activity android:name=".youractivityName" android:screenOrientation="portrait" />

+0

non sono il richiedente, ma forse vuole forzare programmaticamente perché vuole forzarlo in un dato momento? –

8

Il seguente è il codice che ho usato per visualizzare tutte le attività in modalità orizzontale:

<activity android:screenOrientation="landscape" 
      android:configChanges="orientation|keyboardHidden" 
      android:name="abcActivty"/> 
+0

"orientation" Se la tua applicazione punta al livello API 13 o superiore, dovresti anche dichiarare "screenSize" –

33

Nel mio OnCreate(Bundle), io in genere fare quanto segue:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
+0

grazie ..hai fatto il giorno –

+0

il metodo manifest nelle altre risposte non sembra funzionare ma @anwarma il tuo ha fatto – Anup

4

Questo è tutto !! A lungo in attesa di questa correzione.

Ho un vecchio numero di Android su doppio avviare un'attività che richiedeva (programmaticamente) modalità paesaggio: setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Ora Android fanno modalità orizzontale su start.

-23

Premere CTRL+F11 per ruotare lo schermo.

+3

Ora vogliono come impostare l'orientamento predefinito di un'app, non come lo schermo può essere ruotato. –

+0

CTRL + f12 per emulatore. – Lazy

0

Per Android 4.0 (Ice Cream Sandwich) e in seguito, ho dovuto aggiungere questi, oltre al valore landscape.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" 

Utilizzando solo keyboardHidden|orientation sarebbe ancora causare perdite di memoria e la ricreazione delle mie attività quando si preme il pulsante di accensione.

+0

Avviso di cattiva pratica! Questo non ha nulla a che fare con forzare l'attività in modalità orizzontale. Hai sempre bisogno di implementare la memorizzazione e la ricreazione dello stato della tua attività. Questa è la conoscenza base dello sviluppo Android. Non risolverlo con questa soluzione hacky. L'attività può sempre essere chiusa dal sistema se ha bisogno di più memoria. – Roel

+0

@Roel, beh, è ​​l'unico modo per impedire che l'attività ruoti di nuovo in verticale quando ad esempio si ruota il dispositivo. Impedisce che queste modifiche influenzino l'attività. – Peterdk

+0

Ci scusiamo per il messaggio un po 'scontroso, ma l'ho provato e non ho tutti questi valori per la modalità orizzontale. Quando aggiungi tutti questi valori significa che tu gestisci le modifiche da te stesso in onConfigurationChanged() invece che l'attività è appena stata riavviata (e devi implementarla!) Ma se imponi a Landschape una rotazione non accadrà. – Roel

1

Inserirlo nel codice è IMO errato e ancor più se lo si inserisce in onCreate. Fatelo nel manifest e il "sistema" conosce l'orientamento dall'avvio dell'app. E questo tipo di meta o "guida" di livello superiore dovrebbe essere nel manifest. Se vuoi dimostrartelo, fai una pausa nel onCreate di Activity. Se lo fai nel codice, verrà chiamato due volte: si avvia in modalità verticale, quindi passa a orizzontale. Questo non succede se lo fai nel manifest.

+0

Non sono d'accordo. Fare qualsiasi cosa nel codice invece che tramite un manifest è sempre il mio metodo preferito. In base al principio di responsabilità singola, il manifest deve riguardare solo le proprietà a livello di applicazione, i permessi e le associazioni API. In realtà non sono d'accordo con il tag presente in un manifest di un'applicazione e quindi non l'ho mai messo lì (e funziona bene). Come viene presentata un'attività è ovviamente una preoccupazione di presentazione. La tua attività dovrebbe essere la sola responsabile di come viene presentata e quindi di solito inserisco tutte le logiche di presentazione nel codice vista/attività. – ComeIn

5

Una soluzione rapida e semplice è per il file AndroidManifest.xml, aggiungere il seguente per ogni attività che si desidera imporre alla modalità orizzontale:

android:screenOrientation="landscape" 
10

Nel manifesto:

<activity android:name=".YourActivity" 
 
android:screenOrientation="portrait" 
 
android:configChanges="orientation|screenSize">

Nella vostra attività:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
setContentView(R.layout.your_activity_layout); 
1

Questo funziona per Xamarin.Android. Nel OnCreate()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape; 
+0

Chi sta parlando di Xamarin.Android? – Roel

+0

@Roel Sono. Posso chiedere perché il voto negativo? La domanda non specificava se fosse Xamarin o no e gli sviluppatori di Xamarin potrebbero avere una domanda simile. – ComeIn

0

Utilizzare l'ActivityInfo (android.content.pm.ActivityInfo) nel metodo onCreate prima di chiamare setLayout metodo come questo

this.setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);