209 votes

Android: autoriser portrait et paysage pour les tablettes, mais forcer portrait sur téléphone?

Je souhaite que les tablettes puissent être affichées en portrait et en paysage (sw600dp ou supérieur), mais que les téléphones soient limités à portrait. Je ne trouve aucun moyen de choisir conditionnellement une orientation. Aucune suggestion?

475voto

Brian Christensen Points 1516

Voici une bonne manière, en utilisant des ressources et de la taille de qualificatifs.

Mettre cette bool ressource dans res/valeurs bools.xml ou que ce soit (les noms de fichiers n'a pas d'importance ici):

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="portrait_only">true</bool>
    </resources>

De mettre celui-ci dans res/values-sw600dp et res/values-xlarge:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <bool name="portrait_only">false</bool>
    </resources>

Ensuite, dans la méthode onCreate de vos Activités, vous pouvez faire ceci:

    if(getResources().getBoolean(R.bool.portrait_only)){
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

Les appareils qui sont plus de 600 dp dans la plus petite largeur de la direction, ou x-large sur la pré-Android 3.2 appareils (tablettes, essentiellement) se comportent comme normal, basé sur le capteur et de l'utilisateur à verrouillage de rotation, etc. Tout le reste (téléphones, à peu près) sera disponible qu'en mode portrait.

30voto

Avi Kumar Manku Points 3321

Vous pouvez essayer de cette façon d'abord obtenir la taille de l'écran de l'appareil

 if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {     
    Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();

}
else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {     
    Toast.makeText(this, "Normal sized screen" , Toast.LENGTH_LONG).show();

} 
else if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {     
    Toast.makeText(this, "Small sized screen" , Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}
 

puis définir l'orientation en fonction de celle

 setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 

9voto

Ginny Points 591

Voici comment je l'ai fait (inspiré par http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):

Dans AndroidManifest.xml pour chaque activité que vous voulez être en mesure de changer entre le mode portrait et paysage (assurez-vous d'ajouter screenSize - vous n'avez pas besoin de cela!) Vous n'avez pas besoin de définir une orientation de l'écran ici. :

android:configChanges="keyboardHidden|orientation|screenSize"

Méthodes pour ajouter dans chaque Activité:

public static boolean isXLargeScreen(Context context) {
    return (context.getResources().getConfiguration().screenLayout
    & Configuration.SCREENLAYOUT_SIZE_MASK)
    >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
} 

et: (si vous n'avez pas surcharger cette méthode, l'application fera appel onCreate() lors de la modification des orientations)

@Override
public void onConfigurationChanged (Configuration newConfig)
{       
    super.onConfigurationChanged(newConfig);

    if (!isXLargeScreen(getApplicationContext()) ) {            
        return; //keep in portrait mode if a phone      
    }

    //I set background images for landscape and portrait here
}

Dans onCreate() de chaque Activité :

if (!isXLargeScreen(getApplicationContext())) { //set phones to portrait; 
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);            
}
else {
  //I set background images here depending on portrait or landscape orientation 
}

La seule chose que je n'arrive pas à comprendre, c'est comment pour obtenir l'application pour modifier les fichiers de mise en page lors de la commutation du mode paysage au mode portrait ou vice versa. Je suppose que la réponse est en train de faire quelque chose de semblable à ce que le lien ci-dessus, mais je ne pouvais pas obtenir que cela fonctionne pour moi - il a supprimé toutes mes données. Mais si vous avez une assez simple application que vous avez le même fichier de mise en page pour une orientation portrait et paysage, cela devrait fonctionner.

0voto

Erwinus Points 1587

Vieille question, je sais. Pour exécuter votre application en mode portrait, même lorsque l'orientation peut être ou est échangé etc (par exemple sur les tablettes), j'ai conçu cette fonction est utilisée pour régler l'appareil dans le bon sens sans le besoin de savoir comment le portrait et les caractéristiques du paysage sont organisées sur l'appareil.

   private void initActivityScreenOrientPortrait()
    {
        // Avoid screen rotations (use the manifests android:screenOrientation setting)
        // Set this to nosensor or potrait

        // Set window fullscreen
        this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        DisplayMetrics metrics = new DisplayMetrics();
        this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

         // Test if it is VISUAL in portrait mode by simply checking it's size
        boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); 

        if( !bIsVisualPortrait )
        { 
            // Swap the orientation to match the VISUAL portrait mode
            if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
             { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
            else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
        }
        else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }

    }

Fonctionne comme un charme!

AVIS: Variation this.activity par votre activité ou de l'ajouter à l'activité principale et retirez this.activity ;-)

Si vous souhaitez faire le contraire, vous devez modifier le code paysage (mais je pense que c'est clair comment cette).

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