Verhindern Sie die Bildschirmrotation unter Android


315

Ich habe eine meiner Aktivitäten, deren Rotation ich verhindern möchte, da ich eine AsyncTask starte und die Bildschirmrotation sie neu startet.

Gibt es eine Möglichkeit, dieser Aktivität mitzuteilen: "DREHEN SIE DEN Bildschirm NICHT, auch wenn der Benutzer sein Telefon wie verrückt schüttelt"?



11
Sie können sich mit Änderungen der Bildschirmausrichtung und AsyncTasks befassen. Das Verhindern von Änderungen der Bildschirmausrichtung ist nur eine träge Problemumgehung. Und es ist nicht schwer, eine AsyncTask über Orientierungsänderungen hinweg am Leben zu erhalten :)
Romain Guy


56
Es wäre viel hilfreicher, tatsächlich eine Lösung oder einen Code bereitzustellen, Romain, als nur zu behaupten, "eine Lösung existiert und es ist nicht schwer".
Peter vdL

2
Sie können verwenden setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Antworten:


467

Hinzufügen

android:screenOrientation="portrait" 

oder

 android:screenOrientation="landscape" 

zu den <activity>Elementen im Manifest und Sie sind fertig.


95
Bitte beachten Sie, dass dies nur einen Fehler in Ihrer App verbirgt, sodass Benutzer weniger wahrscheinlich darüber stolpern. Aber sie werden es trotzdem tun. Jede Konfigurationsänderung kann dazu führen, dass Ihre Aktivität neu gestartet wird. Sie müssen Ihre Aktivität wirklich korrekt schreiben, um die asynchrone Aufgabe beim Neustart zu verarbeiten.
Hackbod

1
Dies hat in einem Fall bei mir nicht funktioniert. Ich hatte den Bildschirm vor dem Öffnen der App auf Querformat eingestellt. Als ich die App öffnete, drehte sich der Bildschirm im Hochformat und verursachte einen zweiten Aufruf von asynctask.
user522559

2
Sie müssen festlegen, dass "im Hochformat geöffnet" UND "Immer im Hochformat bleiben". Nur 1 zu tun ist sinnlos.
Carol

1
@ Hackbod unabhängig davon, dies ist die Nummer 1 Google-Hit für "Android App verhindern Bildschirmrotation", mein Bedürfnis hat nichts mit asynchronen Aufgaben zu tun
chiliNUT

7
@hackbod Wie schreiben wir dann unsere Aktivität richtig, um dieses Problem zu lösen?
user41805

127

Sie können der folgenden Logik folgen, um zu verhindern, dass der Bildschirm während des AsyncTaskBetriebs automatisch gedreht wird:

  1. Speichern Sie Ihre aktuelle Bildschirmausrichtung in Ihrer Aktivität mit getRequestedOrientation().
  2. Deaktivieren Sie die automatische Bildschirmausrichtung mit setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Führen Sie Ihre aus AsyncTask.
  4. Am Ende Ihrer AsyncTaskWiederherstellung stellen Sie Ihren vorherigen Orientierungsstatus mit wieder her setRequestedOrientation(oldOrientation).

Bitte beachten Sie, dass es verschiedene Möglichkeiten gibt, auf ActivityEigenschaften zuzugreifen (die auf einem UI-Thread ausgeführt werden) AsyncTask. Sie können Ihre AsyncTaskals innere Klasse implementieren oder eine Nachricht verwenden Handler, die Ihre ActiviyKlasse anstößt .


9
Viel besser als die ausgewählte Antwort.
Matej

3
Tolle Idee :) Sie haben Ihre aktuelle Bildschirmausrichtung nicht gespeichert. Sie können ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED verwenden
fligant

Das scheint unglaublich, @emre, danke! Es scheint "Zu schön um wahr zu sein!" Beachten Sie die große Menge an Diskussionen über das Problem: stackoverflow.com/q/3821423/294884 ... Android-Experten, gibt es hier einen Nachteil?! Nochmals vielen Dank .. so viel.
Fattie

3
Mist !! Dies FUNKTIONIERT NICHT, wenn das Gerät im LANDSCHAFTSMODUS BEGINNT. Was zum Teufel! Sux: O
Fattie

@ Emre, Dieser Code funktioniert in bestimmten Fällen nicht. Zum Beispiel, wenn der Benutzer seine Ausrichtung zwischen dem Start und dem Ende Ihrer AsyncTask geändert hat. Sie hätten dann die falsche Ausrichtung gespeichert und wiederhergestellt.
Pacerier

27

Fügen Sie in Ihrer Manifest-Datei für jede Aktivität, für die Sie die Bildschirmdrehung sperren möchten, Folgendes hinzu: Wenn Sie sie im horizontalen Modus sperren möchten:

<activity
        ...
        ...
        android:screenOrientation="landscape">

oder wenn Sie es im vertikalen Modus sperren möchten:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

Der einfachste Weg, dies zu tun, war zu setzen

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

innerhalb von onCreate, gleich danach

setContentView(R.layout.activity_main);

so...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

7

Anstatt in das AndroidManifest zu gehen, können Sie dies einfach tun:

screenOrientation = getResources().getConfiguration().orientation;
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
... AsyncTask

screenOrientation = getResources().getConfiguration().orientation;


@Override
protected void onPostExecute(String things) {
    context.setRequestedOrientation(PlayListFragment.screenOrientation);
    or 
    context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
}

Der einzige Nachteil hierbei ist, dass API Level 18 oder höher erforderlich ist. Im Grunde ist dies die Spitze des Speers.


In diesem Teil wird die Schaltfläche "Startseite" und "Letzte Apps" deaktiviert, und selbst nach dem Aufheben der Sperre mit SCREEN_ORIENTATION_FULL_SENSOR befindet sie sich im deaktivierten Zustand. In Android N.
kAmol

6

Activity.java

@Override     
 public void onConfigurationChanged(Configuration newConfig) {       
        try {     
            super.onConfigurationChanged(newConfig);      
            if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {      
                // land      
            } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {      
               // port       
            }    
        } catch (Exception ex) {       
     }   

AndroidManifest.xml

 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name="QRCodeActivity" android:label="@string/app_name"
  android:screenOrientation="landscape" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>

 </application>

2

Das folgende Attribut für die AKTIVITÄT in AndroidManifest.xml ist alles, was Sie benötigen:

android:configChanges="orientation"

Der vollständige Aktivitätsknoten wäre also:

<activity android:name="Activity1"
          android:icon="@drawable/icon"
          android:label="App Name"
          android:excludeFromRecents="true"
          android:configChanges="orientation">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

1

Hinzufügen:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

Fügen Sie Ihrer AndroidManifest.xml Folgendes hinzu

[app> src> main> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx.zzzzzz.yyyyy">

   <uses-permission android:name="A-PERMISSION" />

   <application>
      <activity android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:configChanges="orientation">
      </activity>
   </application>

</manifest>

0

Wenn Sie Android Developer Tools (ADT) und Eclipse verwenden , können Sie zu AndroidManifest.xml -> Registerkarte Anwendung -> gehen und Ihre Aktivität auswählen. Schließlich wählen Sie Ihre bevorzugte Ausrichtung. Sie können eine der vielen Optionen auswählen.


0

Sie müssen den folgenden Code in die Datei manifest.xml einfügen. Die Aktivität, für die es nicht gedreht werden soll, fügt in dieser Aktivität dieses Element hinzu

android:screenOrientation="portrait"

Dann dreht es sich nicht.


0

Sie können dies versuchen

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itclanbd.spaceusers">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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=".Login_Activity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


0

Verwenden Sie AsyncTaskLoader , um Ihre Daten auch dann zu schützen, wenn sich die Aktivität ändert, anstatt AsyncTask zu verwenden. Dies ist eine bessere Möglichkeit, Apps zu erstellen, als die Bildschirmrotation zu verhindern.


0

Bildschirmdrehung verhindern Fügen Sie einfach die folgende Zeile in Ihre Manifeste ein.

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

Das funktioniert bei mir.


0

Der Benutzer "portrait"in Ihrer AndroidManifest.xml-Datei scheint eine gute Lösung zu sein. Bestimmte Geräte (die im Querformat am besten funktionieren) werden jedoch gezwungen, im Hochformat zu arbeiten, ohne die richtige Ausrichtung zu erhalten. In der neuesten Android-Version wird ein Fehler angezeigt. Mein Vorschlag ist also besser zu verwenden "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.