Wie deaktiviere ich die Orientierungsänderung unter Android?

287

Ich habe eine Anwendung, die ich nur im Hochformat verwenden möchte, also habe ich android definiert: screenOrientation = "Porträt" im Manifest XML. Dies funktioniert für das HTC Magic- Telefon in Ordnung (und verhindert Orientierungsänderungen auch bei anderen Telefonen).

Ich habe jedoch ein Problem mit dem HTC G1- Telefon, da ich die Hardware- QWERTZ-Tastatur (nicht die virtuelle Tastatur) öffne . Meine Aktivität bleibt im Hochformat, aber sie scheint neu gestartet zu werden und verliert alle ihre Zustände. Dies ist bei der HTC Hero- Version nicht der Fall .

Meine Anwendung ist ziemlich groß, daher möchte ich nicht, dass sie neu gestartet wird und beim Öffnen der Tastatur alle Status verliert. Wie kann ich das verhindern?

Vidar Vestnes
quelle

Antworten:

317

Update April 2013: Tu das nicht. Es war keine gute Idee im Jahr 2009, als ich die Frage zum ersten Mal beantwortete, und es ist jetzt wirklich keine gute Idee. Siehe diese Antwort von Hackbod aus folgenden Gründen:

Vermeiden Sie das Nachladen von Aktivitäten mit Asynctask bei Orientierungsänderungen in Android

Fügen Sie android:configChanges="keyboardHidden|orientation"zu Ihrer AndroidManifest.xml hinzu. Dies teilt dem System mit, welche Konfigurationsänderungen Sie selbst vornehmen werden - in diesem Fall, indem Sie nichts tun.

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

Weitere Informationen finden Sie in der Entwicklerreferenz configChanges .

Ihre Anwendung kann jedoch jederzeit unterbrochen werden, z. B. durch einen Telefonanruf. Sie sollten daher unbedingt Code hinzufügen, um den Status Ihrer Anwendung zu speichern, wenn diese angehalten wird.

Update: Ab Android 3.2 müssen Sie auch "screenSize" hinzufügen:

<activity
    android:name="MainActivity"
    android:screenOrientation="portrait"
    android:configChanges="keyboardHidden|orientation|screenSize">

Im Entwicklerhandbuch Umgang mit der Konfiguration Ändern Sie sich

Achtung: Ab Android 3.2 (API-Level 13) ändert sich die "Bildschirmgröße" auch, wenn das Gerät zwischen Hoch- und Querformat wechselt. Wenn Sie also einen Neustart der Laufzeit aufgrund von Orientierungsänderungen bei der Entwicklung für API-Level 13 oder höher (wie durch die Attribute minSdkVersion und targetSdkVersion deklariert) verhindern möchten, müssen Sie zusätzlich zum Wert "Orientierung" den Wert "screenSize" angeben. Das heißt, Sie müssen erklären android:configChanges="orientation|screenSize". Wenn Ihre Anwendung jedoch auf API-Stufe 12 oder niedriger abzielt, behandelt Ihre Aktivität diese Konfigurationsänderung immer selbst (diese Konfigurationsänderung startet Ihre Aktivität nicht neu, selbst wenn sie auf einem Android 3.2-Gerät oder höher ausgeführt wird).

Komplikationen
quelle
36
Um dies zu ergänzen und wirklich explizit zu sein, kann Android Ihre Anwendung unabhängig von Änderungen der Ausrichtung jederzeit gnadenlos beenden. Verwenden Sie daher onPause () und onSaveInstanceState (), um den Status zu speichern, unabhängig davon, was passiert.
Eric Mill
Das 3.2-Update war sehr nützlich und hat mich blockiert. Ich hatte keine Ahnung, warum mein onConfigurationChanged-Handler nicht ausgelöst wurde, und das war es. Vielen Dank!
Sweetlilmre
Der dritte Parameter - screenSize kann in 2.3.x nicht gefunden werden. Sollte ich zu screenLayout wechseln?
Deadfish
2
@ Lumma Nein, "screenSize" wird nur für Android 3.2 und höher benötigt. Auf welche Level-API zielen Sie ab? Ich denke, Sie müssen es nur hinzufügen, wenn Sie Level 13 oder höher anstreben. Ich werde die Antwort aktualisieren, um dies zu klären.
Komplikationen
1
Nur für den Fall, dass es für andere hilfreich ist, habe ich festgestellt, dass Sie beide <... android: configChanges = "Orientierung" ...> Änderungen überschreiben und <... android: screenOrientation = "Porträt" ...> Definieren Sie die Standardeinstellung.
Sogger
97

Sie müssen AndroidManifest.xml modifizieren , wie Intrications (vorher Ashton) erwähnt und stellen Sie sicher , dass die Aktivität Griffe der onConfigurationChanged Veranstaltung , wie Sie wollen , dass es behandelt. So sollte es aussehen:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
ubershmekel
quelle
Wie von Dmitry Zaitsev bemerkt, ist es besser, das setRequestedOrientation()in zu setzen onCreate().
Timmmm
3
Wird onConfigurationChanged()vorher nicht aufgerufen, onCreate()wenn das Festlegen der Ausrichtung vor dem Festlegen von contentViews in oncreate besser ist. Das Festlegen der Konfiguration dort, wo sie hingehört , ist auch sauberer, sodass diese Antwort immer noch gut ist.
Samuel
39

Ich habe immer festgestellt, dass Sie beides brauchen

android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
m00sey
quelle
22

Wie gesagt, setzen Sie android:configChangesIhre Aktivität (in Manifestdatei) auf keyboardHidden|orientationund dann:

1) Überschreiben onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //here you can handle orientation change
}

2) Fügen Sie diese Zeile zu Ihrer Aktivität hinzu onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Es ist besser, als dieselbe Zeile hinzuzufügen onConfigurationChanged, da Ihre App in den Hochformatmodus und dann wieder in den Querformatmodus wechselt (dies geschieht nur einmal, ist aber ärgerlich).

Sie können auch android:screenOrientation="nosensor"für Ihre Aktivität festlegen (im Manifest). Auf diese Weise können Sie jedoch Orientierungsänderungen überhaupt nicht verarbeiten.

Dmitry Zaytsev
quelle
Was kann ich tun, wenn ich vermeiden möchte, dass die Aktivität beim Drehen neu erstellt wird, der Benutzer jedoch die Ausrichtung über die Einstellungen des Betriebssystems sperren möchte?
Android-Entwickler
@androiddeveloper, dass eine separate Frage, die bereits eine Antwort hat: stackoverflow.com/a/14771495/926907
Dmitry Zaytsev
Bei Ihrem Link geht es darum, den Inhalt selbst zu ändern, wenn sich die Konfiguration ändert. Ich möchte jedoch die Rotation der Aktivität vermeiden (damit sie genau so bleibt, wie sie aussieht), falls der Benutzer die Ausrichtung über das Betriebssystem sperren möchte Einstellungen (auf einigen Geräten über die Schnelleinstellungen in der Benachrichtigungsleiste verfügbar).
Android-Entwickler
@androiddeveloper ah, ich glaube ich habe verstanden. Schauen Sie sich dann diesen Link an: developer.android.com/reference/android/… Gemäß den Dokumenten sollte die Standardausrichtung bereits die Benutzerpräferenzen berücksichtigen. Wenn dies nicht der Fall ist, vermute ich, dass es sich um ein betriebssystemspezifisches Verhalten handelt. Ich würde mich freuen über Ihre Ergebnisse zu hören - jetzt bin ich auch daran interessiert :)
Dmitry Zaytsev
Ich weiß, dass die Standardeinstellung die Einstellungen des Benutzers berücksichtigt, aber auch die Aktivität neu erstellt, wenn Sie den Bildschirm drehen, was ich nicht haben möchte.
Android-Entwickler
20

Benutze das..

    android:screenOrientation="portrait"
Muhammad Aamir Ali
quelle
13

Verwenden Sie in der OnCreate-Methode Ihrer Aktivität diesen Code:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Jetzt wird Ihre Ausrichtung auf Hochformat eingestellt und ändert sich nie.

Numenor
quelle
4
Auf diese Weise verhindern Sie nicht, dass die Aktivität jedes Mal neu gestartet wird, wenn sich die Ausrichtung ändert.
AxeEffect
Dies funktioniert auch nicht, wenn Sie die Aktivität aus einer vorherigen Aktivität im Querformat eingeben.
w3bshark
10

Fügen Sie in der Datei AndroidManifest.xml für jede Aktivität, die Sie sperren möchten, die letzte screenOrientationZeile hinzu:

android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >

Oder android: screenOrientation = "Landschaft" .

Gil Allen
quelle
8

In Ihrer androidmanifest.xml- Datei:

   <activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">

oder

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Jorgesys
quelle
6

Um den Bildschirm per Code zu sperren, müssen Sie die tatsächliche Drehung des Bildschirms (0, 90, 180, 270) verwenden und die natürliche Position kennen. Bei einem Smartphone ist die natürliche Position Porträt und bei einem Tablet. Es wird Landschaft sein.

Hier ist der Code (Sperr- und Entsperrmethoden), der auf einigen Geräten (Smartphones und Tablets) getestet wurde und hervorragend funktioniert.

public static void lockScreenOrientation(Activity activity)
{   
    WindowManager windowManager =  (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);   
    Configuration configuration = activity.getResources().getConfiguration();   
    int rotation = windowManager.getDefaultDisplay().getRotation(); 

    // Search for the natural position of the device    
    if(configuration.orientation == Configuration.ORIENTATION_LANDSCAPE &&  
       (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) ||  
       configuration.orientation == Configuration.ORIENTATION_PORTRAIT &&   
       (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270))   
    {   
        // Natural position is Landscape    
        switch (rotation)   
        {   
            case Surface.ROTATION_0:    
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);    
                break;      
            case Surface.ROTATION_90:   
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
            break;      
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
                break;
        }
    }
    else
    {
        // Natural position is Portrait
        switch (rotation) 
        {
            case Surface.ROTATION_0: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
            break;   
            case Surface.ROTATION_90: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
            break;   
            case Surface.ROTATION_180: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT); 
                break;          
            case Surface.ROTATION_270: 
                activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE); 
                break;
        }
    }
}

public static void unlockScreenOrientation(Activity activity)
{
    activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
}
PoOk
quelle
Welcher Parameter sollte als Aktivität übergeben werden?
WISHY
Die Aktivität, die die Methode zum Sperren / Entsperren ihrer Ausrichtung aufruft. Dies ist eine öffentliche statische Dienstprogrammmethode, die aus verschiedenen Aktivitäten aufgerufen werden kann.
PoOk
1
Funktioniert super, aber im Ernst, Android, warum müssen wir das alles nur für die Ausrichtung des Sperrbildschirms tun? !!!
Cocorico
Ja. Dieser sperrt die Orientierung wie im Manifest. Dadurch wird verhindert, dass onConfigurationChanged mehr aufgerufen wird. Gibt es eine Methode, die die Benutzeroberfläche an Landscape sperrt und dennoch onConfigurationChanged aufruft? Genau wie die Kamera-App in Android
Ajith Memana
Es gibt ein SCREEN_ORIENTATION_LOCKED-Flag in SDK 18+, das zu funktionieren scheint, aber Sie möchten trotzdem den obigen Code verwenden, um jedes Gerät zu unterstützen
DominicM
2

In Visual Studio Xamarin:

  1. Hinzufügen:

using Android.Content.PM; zu Ihnen Aktivitäts-Namespace-Liste.

  1. Hinzufügen:

[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]

als Attribut für Ihre Klasse, so:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
Roy Doron
quelle
Diese Frage bezieht sich auf Android, nicht auf Xamarin.Android
Trevor Hart
1

Hinzufügen

android:configChanges="keyboardHidden|orientation|screenSize" 

zu deinem Manifest.

Saurabh
quelle
in Ihrem <Aktivitäts> -Tag
Ege Kuzubasioglu
0

Bitte beachten Sie, dass keine der Methoden jetzt zu funktionieren scheint!

In Android Studio 1 besteht eine einfache Möglichkeit darin, etwas hinzuzufügen android:screenOrientation="nosensor".

Dadurch wird die Bildschirmausrichtung effektiv gesperrt.

kephalian
quelle