Forzare un'attività Android a utilizzare sempre la modalità orizzontale


144

Sto usando Android visualizzatore VNC sul mio HTC G1 . Ma per qualche ragione, quell'applicazione è sempre in modalità orizzontale nonostante il mio G1 sia in modalità verticale. Poiché il visualizzatore VNC per Android è open source, vorrei sapere come è possibile codificare un'attività in modo che sia "orizzontale". Vorrei cambiarlo per rispettare l'orientamento del telefono.

Risposte:


188

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

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

Questa riga specifica screenOrientationcome orizzontale, ma l'autore si spinge oltre a sostituire qualsiasi cambiamento di orientamento dello schermo con configChanges="orientation|keyboardHidden". Questo indica una funzione sovrascritta in VncCanvasActivity.java.

Se guardi VncCanvasActivity, alla riga 109 c'è la funzione override:

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

L'autore ha espressamente inserito un commento per ignorare qualsiasi cambiamento di tastiera o orientamento.


Se vuoi modificarlo, puoi tornare al file AndroidManifest.xml mostrato sopra e cambiare la riga in:

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

Ciò dovrebbe cambiare il programma per passare da verticale a orizzontale quando l'utente ruota il dispositivo.

Questo potrebbe funzionare, ma potrebbe incasinare l'aspetto della GUI, a seconda di come è stato creato il layout. Dovrai renderlo conto. Inoltre, a seconda della modalità di codifica delle attività, è possibile notare che quando si modifica l'orientamento dello schermo, i valori inseriti in tutte le caselle di input scompaiono. Anche questo potrebbe dover essere gestito.


3
Perché è esattamente configChangesnecessario l' attributo? Sembra funzionare sul mio telefono senza tastiera senza di esso ... In quali situazioni l'orientamento cambierà in verticale se hai, screenOrientation="landscape"ma ometti il configChanges?
Timmmm,


come forzare un'attività integrata come la libreria di selezione dell'immagine di sistema solo in orizzontale o verticale?
Jacky,

118

Puoi impostare gli stessi dati anche nel tuo codice java.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Altri valori su ActivityInfo ti permetteranno di riportarlo sul ritratto guidato dal sensore o bloccato. Personalmente, mi piace impostarlo su qualcosa nel Manifest come suggerito in un'altra risposta a questa domanda e poi cambiarlo in seguito usando la chiamata sopra nell'SDK di Android se ce n'è bisogno.


@Yegor Non sempre. Da documenti Android:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya,

40

Nel mio OnCreate(Bundle), generalmente faccio quanto segue:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
il metodo manifest nelle altre risposte non sembra funzionare, ma @anwarma è stato il tuo
Anup

31

È possibile specificare l'orientamento di un'attività nel manifest. Vedi qui .

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

24

Nel manifest:

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

Nella tua attività:

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

11

Di seguito è riportato il codice che ho usato per visualizzare tutte le attività in modalità orizzontale:

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

2
"orientamento" Se l'applicazione è indirizzata al livello API 13 o superiore, è necessario dichiarare anche "screenSize"
Mina Fawzy,

7

Una soluzione rapida e semplice è per il file AndroidManifest.xml, aggiungere quanto segue per ogni attività che si desidera forzare in modalità orizzontale:

android:screenOrientation="landscape"

5

Questo funziona per Xamarin.Android. In OnCreate ()

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

4

Questo è tutto!! Aspettando a lungo questa soluzione.

Ho un vecchio problema di Android relativo al doppio avvio di un'attività che richiedeva la modalità orizzontale (a livello di codice): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Ora Android avvia la modalità orizzontale all'avvio.


3

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


non sono il richiedente, ma forse vuole forzare programmaticamente perché vuole forzarlo in un determinato momento?
Hamzah Malik,

1

Farlo nel codice è IMO sbagliato e ancora di più se lo metti in onCreate. Fallo nel manifest e il "sistema" conosce l'orientamento dall'avvio dell'app. E questo tipo di meta "guida" di alto livello DOVREBBE essere nel manifest. Se vuoi dimostrarlo a te stesso, imposta un'interruzione in Attività su Crea. Se lo fai nel codice, verrà chiamato due volte: si avvia in modalità Ritratto, quindi passa a Orizzontale. Questo non succede se lo fai nel manifest.


1
Non sono d'accordo. Fare qualsiasi cosa nel codice anziché tramite un manifest è sempre il mio metodo preferito. In base al principio della responsabilità unica, il manifest dovrebbe riguardare solo le proprietà, le autorizzazioni e i collegamenti API a livello di applicazione. In realtà non sono d'accordo con il tag <activity> presente in un manifest di applicazione e quindi non l'ho mai inserito (e funziona bene). Il modo in cui viene presentata un'attività è ovviamente un problema di presentazione. La tua attività dovrebbe essere la sola responsabile del modo in cui è presentata e quindi di solito metto tutta la logica di presentazione nel codice vista / attività.
Vieni il

0

Per Android 4.0 (Ice Cream Sandwich) e versioni successive, ho dovuto aggiungere questi, oltre al landscapevalore.

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

L'uso di solo keyboardHidden|orientationcomporterebbe comunque perdite di memoria e ricreazione delle mie attività quando si preme il pulsante di accensione.


Avviso di cattiva pratica! Ciò non ha nulla a che fare con il forzare l'attività in modalità orizzontale. È sempre necessario implementare la memorizzazione e la ricreazione dello stato della propria attività. Questa è la conoscenza di base dello sviluppo Android. Non risolverlo con questa correzione hacky. L'attività può comunque essere chiusa dal sistema se necessita di più memoria.
Roel,

@Roel, beh, è ​​l'unico modo per impedire all'attività di tornare indietro in verticale quando, ad esempio, si ruota il dispositivo. Impedisce che questi cambiamenti di configurazione influiscano sull'attività.
Peterdk,

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 gestisci tu stesso le modifiche in onConfigurationChanged () invece che l'attività viene appena riavviata (e devi implementarla!) Ma se imponi il landschape una rotazione non avverrà.
Roel,

Ciao, alcuni di essi non sono forse necessari, ma ometterli tutti si tradurrà in strani problemi di rotazione. Non posso testare ora, ma quando stavo sviluppando un'app che doveva essere sempre in orizzontale, solo l'utilizzo orientation|screensizenon era sufficiente in tutti i casi. Tornerebbe automaticamente al ritratto.
Peterdk,

Queste modifiche vengono utilizzate anche negli annunci per cellulari di Google e in altri SDK pubblicitari. Ecco da dove li ho presi in quel momento.
Peterdk,

0

Usa ActivityInfo (android.content.pm.ActivityInfo) nel tuo metodo onCreate prima di chiamare il metodo setLayout in questo modo

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

0

usa solo
android: screenOrientation = "portrait" tools: ignore = "LockedOrientationActivity"


0

Aggiungi le seguenti righe nell'attività

Devi entrare in ogni attività

per il paesaggio

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

per ritratto

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Qui l'esempio di MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

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.