Mon activité principale a du code qui apporte des modifications à la base de données qui ne doivent pas être interrompues. Je fais le gros du travail dans un autre thread et j'utilise une boîte de dialogue de progression que j'ai définie comme non annulable. Cependant, j'ai remarqué que si je fais pivoter mon téléphone, il redémarre l'activité, ce qui est VRAIMENT mauvais pour le processus en cours d'exécution, et j'obtiens une fermeture forcée.
Ce que je veux faire, c'est désactiver par programme les changements d'orientation de l'écran jusqu'à ce que mon processus se termine, moment auquel les changements d'orientation sont activés.
android
screen-orientation
android-orientation
Christopher Perry
la source
la source
Réponses:
Comme l'explique Chris dans sa réponse personnelle , appelant
puis
fonctionne vraiment comme du charme ... sur de vrais appareils!
Ne pensez pas qu'il est cassé lors du test sur l'émulateur, le raccourci ctrl + F11 change TOUJOURS l'orientation de l'écran, sans émuler les mouvements des capteurs.
EDIT: ce n'était pas la meilleure réponse possible. Comme expliqué dans les commentaires, cette méthode pose des problèmes. La vraie réponse est ici .
la source
ActivityInfo.SCREEN_ORIENTATION_SENSOR
ne respecte pas le verrou d'orientation natif d'Android. Réinitialisation de l'orientation àActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
fait.Aucune des autres réponses n'a parfaitement fonctionné pour moi, mais voici ce que j'ai trouvé que cela fait.
Verrouiller l'orientation sur le courant ...
Lorsque le changement d'orientation doit être autorisé à nouveau, réinitialiser la valeur par défaut ...
la source
Configuration.ORIENTATION_PORTRAIT
sera renvoyé dans les deux modes paysage (c'est-à-dire «normal» et inversé). Donc, si le téléphone est en orientation paysage inversée et que vous le réglez,ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
il se retournera. Dans l'API 9, ActivityInfo introduit uneSCREEN_ORIENTATION_REVERSE_LANDSCAPE
constante, mais je ne vois pas de moyen de détecter une telle orientation à travers laConfiguration
classe.Voici une solution plus complète et à jour qui fonctionne pour l'API 8+, fonctionne pour le portrait inversé et le paysage, et fonctionne sur un onglet Galaxy où l'orientation «naturelle» est paysage (appelez
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
pour déverrouiller l'orientation):la source
static
et l'ajouter enActivity activity
tant que paramètre.Afin de gérer également les modes d'orientation inversée, j'ai utilisé ce code pour fixer l'orientation de l'activité:
Et pour permettre à nouveau l'orientation:
la source
Utilisation
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
pour verrouiller l'orientation actuelle, qu'elle soit paysage ou portrait.Utilisez
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
pour déverrouiller l'orientation.la source
J'ai trouvé la réponse. Pour ce faire, dans une activité, vous pouvez appeler
setRequestedOrientation(int)
avec l'une des valeurs spécifiées ici: http://developer.android.com/reference/android/R.attr.html#screenOrientationAvant de
setRequestedOrientation(OFF)
lancer mon fil, j'ai appelé (OFF = nosensor) et lorsque le fil était terminé, j'ai appelésetRequestedOrientation(ON)
(ON = capteur). Fonctionne comme un charme.la source
Merci a tous. J'ai modifié la solution de Pilot_51, pour m'assurer de restaurer l'état précédent. J'ai également apporté un changement pour prendre en charge les écrans non-paysage et non-portrait (mais je ne l'ai pas testé sur un tel écran).
Puis pour le restaurer
la source
switch
.la source
Voici une solution qui fonctionne à chaque fois et préserve l'orientation actuelle (en utilisant des
Activity.Info.SCREEN_ORIENTATION_PORTRAIT
ensembles à 0 ° par exemple, mais l'utilisateur peut avoir une orientation à 180 ° comme celle actuelle).la source
à utiliser
ActivityInfo.SCREEN_ORIENTATION_USER
si vous souhaitez faire pivoter l'écran uniquement s'il est activé sur l'appareil.la source
Cela fonctionne parfaitement pour moi. Il résout le problème avec une "orientation naturelle" différente de la tablette / téléphone;)
la source
J'ai trouvé une solution qui dépend de la rotation de l'affichage et décide ensuite de l'orientation de l'appareil. En connaissant l'orientation, nous pouvons verrouiller l'orientation et la libérer plus tard en cas de besoin. Cette solution permet également de déterminer si l'appareil est en mode paysage inversé .
Puis plus tard, si nous devons libérer l'orientation, nous pouvons appeler cette méthode:
la source
Je pense que ce code est plus facile à lire.
la source
J'ai trouvé qu'une combinaison de valeurs de rotation / orientation existantes est nécessaire pour couvrir les quatre possibilités; il y a les valeurs portrait / paysage et l'orientation naturelle de l'appareil. Disons que l'orientation naturelle des appareils aura une valeur de rotation de 0 degré lorsque l'écran est dans son orientation portrait ou paysage "naturelle". De même, il y aura une valeur de rotation de 90 degrés quand il est en paysage ou portrait (notez qu'il est opposé à l'orientation à 0 degrés). Ainsi, les valeurs de rotation qui ne sont pas 0 ou 90 degrés impliqueront une orientation "Inversée". Ok, voici un code:
la source
Je n'ai pas aimé la plupart des réponses ici, car dans le déverrouillage, ils l'ont défini sur NON SPÉCIFIÉ par opposition à l'état précédent. ProjectJourneyman en a tenu compte, ce qui était super, mais j'ai préféré le code de verrouillage de Roy. Donc, ma recommandation serait un mélange des deux:
la source
Vous pouvez utiliser
la source
utiliser cette ligne de code
dans votre activité oncreate méthode
la source