Comment désactiver le changement d'orientation sur Android?
j'ai une application que je voudrais juste utiliser en mode portrait, donc j'ai défini android: screenOrientation= "portrait" dans le manifeste XML. Cela fonctionne bien pour le HTC Magic téléphone (et empêche les changements d'orientation sur les autres téléphones ainsi).
mais j'ai un problème avec le HTC G1 téléphone que j'ouvre le matériel Clavier QWERTY (pas le clavier virtuel). Mon activité reste dans mode portrait, mais il semble avoir redémarré et perd tous ses états. Cela ne se produit pas avec la version HTC Hero .
mon application est assez grande, donc je ne veux pas qu'elle redémarre et perde tous ses états lorsque le clavier est ouvert. Comment puis-je éviter cela?
12 réponses
mise à Jour avril 2013: à ne pas faire. Ce n'était pas une bonne idée en 2009 lorsque j'ai répondu pour la première fois à la question et ce n'est vraiment pas une bonne idée maintenant. Voir la réponse de hackbod pour les raisons suivantes:
éviter de recharger l'activité avec asynctask sur le changement d'orientation dans android
ajouter android:configChanges="keyboardHidden|orientation"
à votre AndroidManifest.XML. Cela indique au système les modifications de configuration que vous allez gérer vous-même - dans ce cas, en ne faisant rien.
<activity android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation">
Voir la référence du Développeur configChanges pour plus de détails.
cependant, votre application peut être interrompue à tout moment, par exemple par un appel téléphonique, de sorte que vous devriez vraiment ajouter du code pour sauver l'état de votre application quand il est arrêté.
mise à jour: à partir D'Android 3.2, vous devez également ajouter "screenSize":
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
Du guide du Développeur Manipulation de la Configuration de Modifier Vous-même
attention: en commençant par Android 3.2( niveau API 13), la " taille de l'écran" change également lorsque l'appareil passe d'un portrait à un paysage orientation. Ainsi, si vous voulez empêcher le redémarrage de l'exécution changement d'orientation lors du développement pour les API de niveau 13 ou plus (comme déclaré par minSdkVersion et targetSdkVersion les attributs de), vous doit inclure le "screenSize" valeur en plus de l'orientation "" valeur. C'est, vous devez déclarer
android:configChanges="orientation|screenSize"
. Toutefois, si votre l'application cible le niveau D'API 12 ou inférieur, puis votre activité toujours gérer cette configuration changer lui-même (ce changement de configuration ne redémarre pas votre activité, même sur Android 3.2 ou dispositif supérieur).
vous devez modifier AndroidManifest.xml comme Intrications (précédemment Ashton) mentionné et assurez-vous que l'activité traite l'événement modifié onconfigurationcomm e vous voulez qu'il soit traité. Voici à quoi ça devrait ressembler:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
j'ai toujours trouvé que vous aviez besoin des deux
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
comme dit, Mettez android:configChanges
de votre activité (dans le fichier manifeste) à keyboardHidden|orientation
et puis:
1) Remplacer onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2) Ajoutez cette ligne à votre activité onCreate()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
c'est mieux que d'ajouter la même ligne à onConfigurationChanged
, parce que votre application va passer en mode portrait puis revenir en mode paysage (ça n'arrivera qu'une fois, mais c'est ennuyeux).
vous aussi peuvent ensemble android:screenOrientation="nosensor"
pour votre activité (dans le manifeste). mais en utilisant cette façon vous n'êtes pas en mesure de gérer les changements d'orientation du tout.
utilisez ceci..
android:screenOrientation="portrait"
dans la méthode OnCreate de votre activité utilisez ce code:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
maintenant votre orientation sera réglée sur portrait et ne changera jamais.
dans L'AndroidManifest.fichier xml, pour chaque activité que vous voulez verrouiller ajouter la dernière ligne screenOrientation
:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
Ou android:screenOrientation="paysage", .
dans votre androidmanifest.xml fichier:
<activity android:name="MainActivity" android:configChanges="keyboardHidden|orientation">
ou
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
pour verrouiller l'écran par code, vous devez utiliser la rotation réelle de l'écran (0, 90, 180, 270) et vous devez connaître la position naturelle de celui-ci, dans un smartphone la position naturelle sera portrait et dans une tablette, il sera paysage.
voici le code (méthodes de verrouillage et de déverrouillage), il a été testé sur certains appareils (smartphones et tablettes) et il fonctionne très bien.
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);
}
Dans Visual Studio Xamarin:
- ajouter:
using Android.Content.PM;
à vous de l'activité de l'espace de noms de la liste.
- ajouter:
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
comme un attribut de votre classe, comme ça:
[Activity(ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : Activity
{...}
ajouter
android:configChanges="keyboardHidden|orientation|screenSize"
à votre manifeste.
s'il vous Plaît noter, aucune des méthodes semble fonctionner maintenant!
In Android Studio 1 une façon simple est d'ajouter
android:screenOrientation="nosensor"
.
cela bloque efficacement l'orientation de l'écran.