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?
Réponses
Trop de publicités?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.
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);
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.
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).