Comment puis-je désactiver le changement d'orientation sur Android?
-
19-09-2019 - |
Question
Je demande que je voudrais simplement utiliser en mode portrait, donc je l'ai défini android: screenOrientation = "portrait" dans le manifeste XML. Cela fonctionne bien pour le téléphone de HTC Magic (et empêche les changements d'orientation sur d'autres téléphones aussi bien).
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 en mode portrait, mais il semble se remis en marche et perd tous ses états. Cela ne se produit pas avec le version de HTC Hero.
Mon application est assez grand, donc je ne veux pas de redémarrer et de perdre tous ses états lorsque le clavier est ouvert. Comment puis-je empêcher cela?
La solution
Mise à jour Avril 2013: Ne pas faire cela. Ce ne fut pas une bonne idée en 2009 quand je répondu à la question et il est vraiment pas une bonne idée maintenant. Voir cette réponse par hackbod pour des raisons:
Évitez rechargeant 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 référence développeur configChanges pour plus de détails.
Cependant, l'application peut être interrompue à tout moment, par exemple par un appel téléphonique, de sorte que vous devriez vraiment ajouter du code pour enregistrer l'état de votre application lorsqu'elle est en pause.
Mise à jour: Comme d'Android 3.2, vous devez également ajouter "ScreenSize":
<activity
android:name="MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize">
du guide développeur Gestion de la configuration changement vous-même
Mise en garde: En commençant par Android 3.2 (niveau API 13), la "taille de l'écran" change également lorsque l'appareil passe entre les modes portrait et paysage orientation. Ainsi, si vous voulez éviter le redémarrage d'exécution en raison de changement d'orientation lors du développement pour le niveau de l'API 13 ou plus (comme Déclarant la minSdkVersion et les attributs targetSdkVersion), vous doit inclure la valeur « ScreenSize » en plus de la « orientation » valeur. Autrement dit, vous devez déclarer
android:configChanges="orientation|screenSize"
. Toutefois, si votre objectifs d'application de niveau API 12 ou moins, votre activité toujours gère ce changement de configuration lui-même (ce changement de configuration ne redémarre pas votre activité, même lors de l'exécution sur un Android 3.2 ou dispositif supérieur).
Autres conseils
Vous devez modifier AndroidManifest.xml comme intrications (anciennement Ashton) mentionné et assurez-vous que l'activité gère l'événement onConfigurationChanged comme vous le souhaitez traité. Voici comment cela devrait ressembler à:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Je l'ai toujours trouvé que vous avez besoin à la fois
android:screenOrientation="nosensor" android:configChanges="keyboardHidden|orientation"
Comme dit, définissez android:configChanges
de votre activité (dans le fichier manifeste) à keyboardHidden|orientation
puis:
1) Remplacer onConfigurationChanged()
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
//here you can handle orientation change
}
2) Ajouter cette ligne à la onCreate()
de votre activité
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Il vaut mieux que d'ajouter une même ligne à onConfigurationChanged
, parce que votre application tournera en mode portrait, puis de nouveau au paysage (il se produira qu'une seule fois, mais il est ennuyeux).
Vous pouvez également définir android:screenOrientation="nosensor"
pour votre activité (dans le manifeste). Mais en utilisant cette façon, vous êtes pas en mesure de gérer l'orientation change du tout.
Cette ..
android:screenOrientation="portrait"
Dans la méthode OnCreate de votre activité utiliser ce code:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Maintenant, votre orientation sera réglé sur le portrait et ne changera jamais.
Dans le fichier AndroidManifest.xml, pour chaque activité que vous voulez verrouiller ajouter la dernière ligne de screenOrientation
:
android:label="@string/app_name"
android:name=".Login"
android:screenOrientation="portrait" >
ou android. ScreenOrientation = "paysage"
Dans 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 le code que 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 une tablette, il sera paysage.
Voici le code (verrouiller et déverrouiller les méthodes), il a été testé dans 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 liste d'espace de noms d'activité.
- Ajouter:
[Activity(ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait)]
comme un attribut de vous 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!
Dans Studio de 1 un moyen simple est d'ajouter
android:screenOrientation="nosensor"
.
Cela verrouille effectivement l'orientation de l'écran.