J'aimerais empêcher une rotation de l'une de mes activités car je commence une tâche asynchrone et la rotation de l'écran la fait redémarrer.
Y a-t-il un moyen de dire à cette activité "NE TOURNEZ PAS l'écran même si l'utilisateur secoue son téléphone comme un fou"?
Ajouter
Android:screenOrientation="portrait"
ou
Android:screenOrientation="landscape"
dans le <activity>
élément/s du manifeste et vous avez terminé.
Vous pouvez suivre la logique ci-dessous pour empêcher la rotation automatique de l'écran lorsque votre AsyncTask
est en cours d'exécution:
getRequestedOrientation()
.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
.AsyncTask
.AsyncTask
, restaurez votre statut d'orientation précédent à l'aide de setRequestedOrientation(oldOrientation)
.Veuillez noter qu'il existe plusieurs façons d'accéder aux propriétés Activity
(qui s'exécute sur le thread d'interface utilisateur) à l'intérieur d'un AsyncTask
. Vous pouvez implémenter votre AsyncTask
en tant que classe interne ou vous pouvez utiliser le message Handler
qui envoie votre classe Activiy
.
Dans votre fichier Manifest, pour chaque activité pour laquelle vous souhaitez verrouiller la rotation de l'écran, ajoutez: si vous souhaitez le verrouiller en mode horizontal:
<activity
...
...
Android:screenOrientation="landscape">
ou si vous voulez le verrouiller en mode vertical:
<activity
...
...
Android:screenOrientation="portrait">
Le moyen le plus simple que j’ai trouvé était de mettre
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
dans onCreate, juste après
setContentView(R.layout.activity_main);
alors...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Plutôt que d'entrer dans le Manifeste Android, 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 que cela nécessite une API de niveau 18 ou supérieur. Donc, fondamentalement, ceci est la pointe de la lance.
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>
L'attribut suivant sur ACTIVITY 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>
Ajoutez ce qui suit à votre AndroidManifest.xml
[app> src> main> 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>
Ajouter:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
...
...
...
}
Si vous utilisez Outils de développement Android (ADT) et Eclipse , vous pouvez accéder à 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.
Utilisez AsyncTaskLoader pour protéger vos données même si l'activité change, au lieu d'utiliser AsyncTask, il s'agit d'un meilleur moyen de créer des applications que d'empêcher la rotation de l'écran.
Vous devez ajouter le code suivant dans le fichier manifest.xml. L'activité pour laquelle il ne doit pas être en rotation, dans cette activité, ajoutez cet élément
Android:screenOrientation="portrait"
Ensuite, il ne tournera pas.
Empêcher la rotation de l'écran, ajoutez simplement la ligne suivante dans vos manifestes.
<activity
Android:name=".YourActivity"
Android:screenOrientation="portrait" />
Cela fonctionne pour moi.
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>