321 votes

Comment déterminer la catégorie de taille d'écran de l'appareil (petit, normal, grand, xlarge) à l'aide du code ?

Existe-t-il un moyen de déterminer la catégorie de taille d'écran de l'appareil actuel, comme petit, normal, grand, xlarge ?

Pas la densité, mais la taille de l'écran.

428voto

Jeff Gilfelt Points 15494

Vous pouvez utiliser le Configuration.screenLayout bitmask.

Exemple :

if ((getResources().getConfiguration().screenLayout & 
    Configuration.SCREENLAYOUT_SIZE_MASK) == 
        Configuration.SCREENLAYOUT_SIZE_LARGE) {
    // on a large screen device ...

}

32 votes

Pour obtenir la détection x-large, assurez-vous d'utiliser la cible Android-3.0 dans votre projet. Ou utilisez la valeur statique 4 pour x-large.

5 votes

Certains appareils peuvent avoir une taille d'écran UNDEFINED, il peut donc être utile de vérifier également avec Configuration.SCREENLAYOUT_SIZE_UNDEFINED.

0 votes

Pourriez-vous utiliser >= pour obtenir des écrans plus grands ou plus grands ?

152voto

Mel Points 2132

Le code ci-dessous étoffe la réponse ci-dessus, en affichant l'icône la taille de l'écran comme un toast.

//Determine screen size
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();
}

Le code ci-dessous affiche le densité de l'écran comme un toast.

//Determine density
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int density = metrics.densityDpi;

if (density == DisplayMetrics.DENSITY_HIGH) {
    Toast.makeText(this, "DENSITY_HIGH... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_MEDIUM) {
    Toast.makeText(this, "DENSITY_MEDIUM... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else if (density == DisplayMetrics.DENSITY_LOW) {
    Toast.makeText(this, "DENSITY_LOW... Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}
else {
    Toast.makeText(this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + String.valueOf(density), Toast.LENGTH_LONG).show();
}

0 votes

Le pain grillé est agréable pour le deving.

0 votes

Quelqu'un peut-il confirmer qu'il s'agit d'un modèle extra-large ?

68voto

qwertzguy Points 1021

Jeff Gilfelt comme une méthode d'aide statique :

private static String getSizeName(Context context) {
    int screenLayout = context.getResources().getConfiguration().screenLayout;
    screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK;

    switch (screenLayout) {
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        return "small";
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        return "normal";
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        return "large";
    case 4: // Configuration.SCREENLAYOUT_SIZE_XLARGE is API >= 9
        return "xlarge";
    default:
        return "undefined";
    }
}

11voto

A. Masson Points 372

Merci pour les réponses ci-dessus, cela m'a beaucoup aidé :-) Mais pour ceux (comme moi) qui sont obligés de continuer à supporter Android 1.5, nous pouvons utiliser la réflexion java pour une compatibilité descendante :

Configuration conf = getResources().getConfiguration();
int screenLayout = 1; // application default behavior
try {
    Field field = conf.getClass().getDeclaredField("screenLayout");
    screenLayout = field.getInt(conf);
} catch (Exception e) {
    // NoSuchFieldException or related stuff
}
// Configuration.SCREENLAYOUT_SIZE_MASK == 15
int screenType = screenLayout & 15;
// Configuration.SCREENLAYOUT_SIZE_SMALL == 1
// Configuration.SCREENLAYOUT_SIZE_NORMAL == 2
// Configuration.SCREENLAYOUT_SIZE_LARGE == 3
// Configuration.SCREENLAYOUT_SIZE_XLARGE == 4
if (screenType == 1) {
    ...
} else if (screenType == 2) {
    ...
} else if (screenType == 3) {
    ...
} else if (screenType == 4) {
    ...
} else { // undefined
    ...
}

2 votes

Vous pouvez cibler la dernière version de la plate-forme et faire référence aux constantes de la page d'accueil. Configuration classe. Il s'agit de valeurs finales statiques qui seront intégrées au moment de la compilation (c'est-à-dire qu'elles seront remplacées par leurs valeurs réelles), de sorte que votre code ne sera pas cassé sur les anciennes versions de la plate-forme.

0 votes

Sympa, je ne le savais pas... Parlez-vous de Android:targetSdkVersion ?

1 votes

Oui, c'est ainsi que l'on peut cibler une version particulière. La plupart des gens (du moins ce que j'ai vu) définissent leur targetSdkVersion à la dernière version.

9voto

mmathieum Points 345

Si vous souhaitez connaître facilement la densité et la taille de l'écran d'un appareil Android, vous pouvez utiliser cette application gratuite (aucune autorisation requise) : https://market.Android.com/details?id=com.jotabout.screeninfo

3 votes

Cette question ne porte pas sur un appareil spécifique, mais sur la programmation pour des profils de division multiples (ce qui est un processus de développement logiciel important lorsqu'on développe pour des plateformes mobiles).

1 votes

Bonne application pour savoir qu'elle est disponible sur le marché - il serait également intéressant de voir le code utilisé par l'application pour obtenir ses informations

4 votes

@StanKurdziel Le code source est publié sous la licence open-source MIT et est disponible à l'adresse suivante : github.com/mportuesisf/ScreenInfo

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