114 votes

Android: désactiver Temporairement les changements d'orientation dans une Activité

Mon activité principale a un peu de code qui fait que certaines modifications de base de données ne doit pas être interrompue. Je suis en train de faire le gros du travail dans un autre thread, et à l'aide d'une boîte de dialogue de progression qui-je définir comme non résiliables. Cependant, j'ai remarqué que si je tourne mon téléphone, il redémarrage de l'activité qui est VRAIMENT mauvais pour le processus qui était en cours d'exécution, et j'ai un Force Close.

Ce que je veux faire est par programmation désactiver l'écran de changements d'orientation jusqu'à ma fin du processus, au moment où les changements d'orientation sont activés.

162voto

Kevin Gaudin Points 6395

Comme l'a expliqué Chris dans son auto-réponse, l'appel de

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

et puis

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

vraiment fonctionne comme un charme... sur des dispositifs réels !

Ne pensez pas que c'est cassé lors de l'essai sur l'émulateur, le ctrl+F11 raccourci TOUJOURS changer l'orientation de l'écran, sans émulation de capteurs de mouvements.

EDIT: ce n'était pas la meilleure réponse possible. Comme expliqué dans les commentaires, il y a des problèmes avec cette méthode. La vraie réponse est ici.

43voto

Pilot_51 Points 2880

Aucune des autres réponses a fonctionné parfaitement pour moi, mais voici ce que j'ai trouvé qui ne.

Verrouillage de l'orientation de courant...

if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Lors d'un changement d'orientation devraient être autorisés, par défaut...

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

38voto

Roy Points 91

Ici, c'est un plus complète et à jour de la solution qui fonctionne pour API 8+, travaille pour inverser portrait et paysage, et travaille sur une Galaxy tab, où le "naturel" orientation paysage (appelez - activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) pour déverrouiller l'orientation):

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
private void lockOrientation() {
    Display display = activity.getWindowManager().getDefaultDisplay();
    int rotation = display.getRotation();
    int height;
    int width;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
        height = display.getHeight();
        width = display.getWidth();
    } else {
        Point size = new Point();
        display.getSize(size);
        height = size.y;
        width = size.x;
    }
    switch (rotation) {
    case Surface.ROTATION_90:
        if (width > height)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        else
            activity.setRequestedOrientation(9/* reversePortait */);
        break;
    case Surface.ROTATION_180:
        if (height > width)
            activity.setRequestedOrientation(9/* reversePortait */);
        else
            activity.setRequestedOrientation(8/* reverseLandscape */);
        break;          
    case Surface.ROTATION_270:
        if (width > height)
            activity.setRequestedOrientation(8/* reverseLandscape */);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    default :
        if (height > width)
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        else
            activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

14voto

Christopher Perry Points 7972

J'ai trouvé la réponse. Pour ce faire, dans une Activité, vous pouvez appeler setRequestedOrientation(int) avec l'une des valeurs indiquées ici: http://developer.android.com/reference/android/R.attr.html#screenOrientation

Avant que j'ai débuté mon thread, j'ai appelé setRequestedOrientation(OFF) (OFF = nosensor) et lorsque le thread a été fait, j'ai appelé setRequestedOrientation(ON) (=capteur). Fonctionne comme un charme.

11voto

ProjectJourneyman Points 1840

Merci à tous. J'ai modifié Pilot_51 de la solution, assurez-vous que j'ai restauré à l'état précédent. J'ai aussi jeté un changement à l'appui d'un paysage et non portrait écrans (mais ne l'ai pas testé sur un écran de ce type).

prevOrientation = getRequestedOrientation();
if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}

Puis de la restaurer

setRequestedOrientation(prevOrientation);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X