Frage

Ich habe eine Anwendung, dass ich möchte nur im Portrait-Modus verwenden, so dass ich definiert haben Android: screenOrientation = "Portrait" im Manifest XML. Dies funktioniert OK für die HTC Magic Telefon (und verhindert Orientierung ändert sich auf andere Telefone als auch).

Aber ich habe ein Problem mit dem HTC G1 Telefon als ich die Hardware öffnen QWERTZ-Tastatur (nicht die virtuelle Tastatur). Meine Tätigkeit Aufenthalte im Portrait-Modus, aber es scheint zu erhalten neu gestartet und verliert alle seine Zustände. Dies geschieht nicht mit dem HTC Hero Version.

Meine Anwendung ist recht groß, so dass ich es nicht will alle ihre Zustände neu zu starten und verlieren, wenn die Tastatur geöffnet ist. Wie kann ich das verhindern?

War es hilfreich?

Lösung

Update April 2013: Tun Sie dies nicht tun. Es war keine gute Idee, im Jahr 2009, als ich zum ersten Mal die Frage beantwortet, und es ist wirklich keine gute Idee, jetzt. Sehen Sie diese Antwort von hackbod Gründen:

Vermeiden Nachladen Aktivität mit AsyncTask auf Orientierungsänderung in android

In android:configChanges="keyboardHidden|orientation" zu AndroidManifest.xml. Dies teilt das System mit, welche Konfigurationsänderungen Sie gehen selbst zu behandeln -. In diesem Fall durch nichts zu tun

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

Siehe Entwickler Referenz configChanges für weitere Details.

Allerdings kann die Anwendung jederzeit unterbrochen werden, z.B. durch einen Anruf, so dass Sie wirklich Code hinzufügen, sollten Sie den Status Ihrer Anwendung zu speichern, wenn er angehalten.

Update: Ab Android 3.2, müssen Sie auch "Screen" hinzuzufügen:

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

Von Entwicklerführer Umgang mit der Konfigurationsänderung Yourself

  

Achtung: Beginnend mit Android 3.2 (API-Ebene 13), die "Bildschirmgröße"   ändert sich auch, wenn das Gerät schaltet zwischen Hoch- und Quer   Orientierung. So möchten, wenn Sie Laufzeit neu gestartet verhindern aufgrund   Orientierungsänderung, wenn für die API-Level 13 oder höher zu entwickeln (wie   erklärte der minSdkVersion und targetSdkVersion Attribute), Sie   muss den „Screen“ Wert zusätzlich zu der „Orientierung“   Wert. Das heißt, müssen Sie erklären   android:configChanges="orientation|screenSize". Allerdings, wenn Ihr   Anwendungsziele API Level 12 oder niedriger ist, dann Ihre Aktivität immer   nimmt diese Konfigurationsänderung selbst (diese Konfigurationsänderung   Kein Neustart Ihre Aktivität, selbst wenn sie auf einem Android 3.2 läuft oder   höheres Gerät).

Andere Tipps

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

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

Ich habe immer gefunden, müssen Sie sowohl

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

Wie gesagt, Satz android:configChanges Ihre Aktivität (in-Manifest-Datei) zu keyboardHidden|orientation und dann:

1) außer Kraft setzen onConfigurationChanged()

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

2) Fügen Sie diese Zeile in der Tätigkeit der onCreate()

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Es ist besser als Add gleiche Linie zu onConfigurationChanged, weil Ihre App Portrait-Modus drehen und dann wieder auf Landschaft (es wird nur ein einziges Mal passieren, aber es ist ärgerlich).

Sie können auch android:screenOrientation="nosensor" für Ihre Aktivität (in manifest) gesetzt. Aber mit dieser Art und Weise sind Sie ein nicht in der Lage zu handhaben Orientierungsänderungen an alle.

Mit diesem ..

    android:screenOrientation="portrait"

In OnCreate Methode Ihrer Aktivität diesen Code verwenden:

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

Jetzt ist Ihre Ausrichtung wird auf Hochformat festgelegt werden und wird sich nie ändern.

In der AndroidManifest.xml Datei für jede Aktivität möchten Sie die letzte screenOrientation Zeile hinzufügen sperren:

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

oder Android. ScreenOrientation = "Landschaft"

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);
}

Um den Bildschirm von Code sperren Sie die tatsächliche Drehung des Bildschirms verwenden (0, 90, 180, 270), und Sie haben die natürliche Position, es zu wissen, in einem Smartphone die natürliche Position Porträt sein wird und in eine Tablette, wird es Landschaft sein.

Hier ist der Code (Schloss und Unlock-Methoden), hat es sich in einigen Geräten (Smartphones und Tablets) getestet und es funktioniert super.

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);
}

In Visual Studio Xamarin:

  1. Fügen Sie:

using Android.Content.PM; Sie Aktivität Namespace-Liste.

  1. Fügen Sie:

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

als Attribut Sie Klasse, wie folgt aus:

[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}

Add

android:configChanges="keyboardHidden|orientation|screenSize" 

Ihren manifestieren.

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

Android Studio 1 eine einfache Möglichkeit ist hinzuzufügen, android:screenOrientation="nosensor".

Diese effektiv sperrt die Bildschirmausrichtung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top