Empêcher la rotation de l'écran sur Android

J'ai une de mes activités que je voudrais empêcher de tourner parce que je démarre une AsyncTask, et la rotation de l'écran le fait redémarrer.

Existe-t-il un moyen de dire à cette activité "ne pas faire pivoter l'écran même si l'utilisateur secoue son téléphone comme un fou"?

276
demandé sur Peter Mortensen 2010-04-28 19:25:14

13 réponses

Ajouter

android:screenOrientation="portrait" 

Ou

 android:screenOrientation="landscape" 

Au (x) élément (s) <activity> dans le manifeste et vous avez terminé.

406
répondu lbedogni 2018-08-30 13:18:48

, Vous pouvez suivre la logique ci-dessous pour empêcher la rotation automatique de l'écran tout votre AsyncTask est en cours d'exécution:

  1. stockez votre orientation d'écran actuelle dans votre activité en utilisant getRequestedOrientation().
  2. désactiver l'orientation automatique de l'écran en utilisant setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. exécutez / exécutez votre AsyncTask.
  4. à la fin de votre AsyncTask restaurez votre statut d'orientation précédent en utilisant setRequestedOrientation(oldOrientation).

, Veuillez noter qu'il existe plusieurs façons d'accéder Activity (qui s'exécute sur le thread de L'interface utilisateur) propriétés à l'intérieur d'un AsyncTask. Vous pouvez implémenter votre AsyncTask en tant que classe interne ou vous pouvez utiliser message Handler cela pousse votre classe Activiy.

124
répondu Emre Yazici 2014-05-19 15:52:55

Dans le fichier de Manifeste, pour chaque Activité que vous souhaitez verrouiller la rotation de l'écran ajouter: si vous souhaitez verrouiller en mode horizontal:

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

, Ou si vous voulez verrouiller en mode vertical:

<activity
            ...
            ...
            android:screenOrientation="portrait">
24
répondu Sara 2015-12-01 16:12:35

Le moyen le plus simple que j'ai trouvé pour le faire était de mettre

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

Dans onCreate, juste après

setContentView(R.layout.activity_main);

Donc...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
22
répondu Paul Alexander 2017-01-22 10:01:09

De l'Activité.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>
5
répondu Li Che 2013-06-27 12:10:35

Plutôt que d'aller dans L'AndroidManifest, vous pouvez simplement faire ceci:

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

Le seul inconvénient ici est qu'il nécessite un niveau D'API 18 ou supérieur. Donc, fondamentalement, c'est la pointe de la lance.

5
répondu Antuan Develle Claude 2016-03-04 19:51:16

L'attribut suivant sur L'activité dans AndroidManifest.xml est tout ce dont vous avez besoin:

android:configChanges="orientation"

Ainsi, le nœud d'activité complet serait:

<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>
2
répondu Ben 2016-03-04 19:46:32

Ajouter:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}
1
répondu Anas 2016-03-04 19:50:53

Si vous utilisez Android Developer Tools (ADT) et de Eclipse vous pouvez aller à votre AndroidManifest.xml - >Application onglet - > descendez et sélectionnez votre activité. Enfin, sélectionnez votre orientation préférée. Vous pouvez sélectionner l'une des nombreuses options.

0
répondu Husam 2016-03-04 19:49:42

, Vous devez ajouter le code suivant dans le manifeste.fichier xml. L'activité pour laquelle il ne doit pas tourner, dans cette activité ajouter cet élément

android:screenOrientation="portrait"

Alors il ne tournera pas.

0
répondu Simon Chius 2017-01-22 09:59:36

Vous pouvez essayer de cette façon

<?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
répondu Muhaiminurabir 2018-05-24 07:08:12

Ajoutez ce qui suit à votre AndroidManifest.xml

[ app > src > principal > AndroidManifest.xml ]

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

Exemple:

<?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
répondu andrewoodleyjr 2018-07-24 03:38:09

Utilisez AsyncTaskLoader pour protéger vos données même si l'activité change, au lieu d'utiliser AsyncTask c'est une meilleure façon de créer des applications que d'empêcher la rotation de l'écran.

0
répondu Bbake Waikhom 2018-07-29 02:01:14