Wie bestimme ich die Bildschirmgrößenkategorie des Geräts (klein, normal, groß, groß) mithilfe von Code?


308

Gibt es eine Möglichkeit, die Kategorie der Bildschirmgröße des aktuellen Geräts zu bestimmen, z. B. klein, normal, groß, groß?

Nicht die Dichte, sondern die Bildschirmgröße.

Antworten:


420

Sie können die Configuration.screenLayoutBitmaske verwenden.

Beispiel:

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

}

31
Stellen Sie sicher, dass Sie in Ihrem Projekt das Ziel Android-3.0 verwenden, um eine x-große Erkennung zu erhalten. Oder verwenden Sie den statischen Wert 4 für x-large.
Peterdk

5
Einige Geräte können eine UNDEFINED-Größe des Bildschirms haben. Dies kann daher auch bei Configuration.SCREENLAYOUT_SIZE_UNDEFINED hilfreich sein.
Valerybodak

Könnten Sie> = verwenden, um große oder größere Bildschirme zu erhalten?
Andrew S

150

Der folgende Code konkretisiert die obige Antwort und zeigt die Bildschirmgröße als Toast an.

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

Dieser Code unten zeigt die Bildschirmdichte als Toast an.

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

Der Toast ist schön zum Tauchen.
MinceMan

kann jemand extra groß bestätigen?
Nathan H

68

Jeff Gilfilts Antwort als statische Hilfsmethode :

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";
    }
}

12
private String getDeviceDensity() {
    int density = mContext.getResources().getDisplayMetrics().densityDpi;
    switch (density)
    {
        case DisplayMetrics.DENSITY_MEDIUM:
            return "MDPI";
        case DisplayMetrics.DENSITY_HIGH:
            return "HDPI";
        case DisplayMetrics.DENSITY_LOW:
            return "LDPI";
        case DisplayMetrics.DENSITY_XHIGH:
            return "XHDPI";
        case DisplayMetrics.DENSITY_TV:
            return "TV";
        case DisplayMetrics.DENSITY_XXHIGH:
            return "XXHDPI";
        case DisplayMetrics.DENSITY_XXXHIGH:
            return "XXXHDPI";
        default:
            return "Unknown";
    }
}

1
Dies erhält die Dichte des Bildschirms. Die Frage gibt "Nicht die Dichte, sondern die Bildschirmgröße" an.
Subaru Tashiro

11

Vielen Dank für die obigen Antworten, die mir sehr geholfen haben :-) Aber für diejenigen (wie mich), die gezwungen sind, Android 1.5 weiterhin zu unterstützen, können wir Java Reflection für abwärtskompatibel verwenden:

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
Sie können auf die neueste Version der Plattform abzielen und auf die Konstanten aus der ConfigurationKlasse verweisen . Dies sind statische Endwerte, die beim Kompilieren eingefügt werden (dh sie werden durch ihre tatsächlichen Werte ersetzt), damit Ihr Code auf älteren Versionen der Plattform nicht beschädigt wird.
Karakuri

Schön, dass ich das nicht wusste ... Sprechen Sie über Android: targetSdkVersion?
A. Masson

1
Ja, so würden Sie eine bestimmte Version anvisieren. Die meisten Leute (zumindest die ich gesehen habe) haben ihre targetSdkVersionauf die neueste Version eingestellt.
Karakuri

9

Wenn Sie die Bildschirmdichte und -größe eines Android-Geräts leicht ermitteln möchten, können Sie diese kostenlose App verwenden (keine Berechtigung erforderlich): https://market.android.com/details?id=com.jotabout.screeninfo


3
Bei dieser Frage geht es nicht um ein bestimmtes Gerät, sondern um die Programmierung für mehrere Divice-Profile (was ein wichtiger Softwareentwicklungsprozess bei der Entwicklung für mobile Plattformen ist).
Mtmurdock

1
Gute App zu wissen ist auf dem Markt erhältlich - wäre auch schön zu sehen,
welchen

4
@ StanKurdziel Der Quellcode wird unter der Open-Source-Lizenz des MIT veröffentlicht und ist verfügbar unter: github.com/mportuesisf/ScreenInfo
mmathieum

Dieser Link ist jetzt tot
Vadim Kotov

5

Müssen Sie nach großen Bildschirmen und hohen Dichten suchen? Dies ist der geänderte Code aus der gewählten Antwort.

//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 if ((getResources().getConfiguration().screenLayout &      Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {     
    Toast.makeText(this, "XLarge sized screen" , Toast.LENGTH_LONG).show();
} else {
    Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();
}

//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 if (density==DisplayMetrics.DENSITY_XHIGH) {
    Toast.makeText(this, "DENSITY_XHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXHIGH) {
    Toast.makeText(this, "DENSITY_XXHIGH... Density is " + String.valueOf(density),  Toast.LENGTH_LONG).show();
} else if (density==DisplayMetrics.DENSITY_XXXHIGH) {
    Toast.makeText(this, "DENSITY_XXXHIGH... 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();
}

[Dichte] In diesem Fall müssen Sie aktiv sein. Wenn Sie außerhalb sind, verwenden Sie getWindowManager () diesen Code WindowManager windowManager = (WindowManager) context .getSystemService (Context.WINDOW_SERVICE);
Horkavlna

3

Hier ist eine Xamarin.Android-Version von Tom McFarlins Antwort

        //Determine screen size
        if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeLarge) {
            Toast.MakeText (this, "Large screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeNormal) {
            Toast.MakeText (this, "Normal screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeSmall) {
            Toast.MakeText (this, "Small screen", ToastLength.Short).Show ();
        } else if ((Application.Context.Resources.Configuration.ScreenLayout & ScreenLayout.SizeMask) == ScreenLayout.SizeXlarge) {
            Toast.MakeText (this, "XLarge screen", ToastLength.Short).Show ();
        } else {
            Toast.MakeText (this, "Screen size is neither large, normal or small", ToastLength.Short).Show ();
        }
        //Determine density
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager.DefaultDisplay.GetMetrics (metrics);
        var density = metrics.DensityDpi;
        if (density == DisplayMetricsDensity.High) {
            Toast.MakeText (this, "DENSITY_HIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Medium) {
            Toast.MakeText (this, "DENSITY_MEDIUM... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Low) {
            Toast.MakeText (this, "DENSITY_LOW... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xhigh) {
            Toast.MakeText (this, "DENSITY_XHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxhigh) {
            Toast.MakeText (this, "DENSITY_XXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else if (density == DisplayMetricsDensity.Xxxhigh) {
            Toast.MakeText (this, "DENSITY_XXXHIGH... Density is " + density, ToastLength.Long).Show ();
        } else {
            Toast.MakeText (this, "Density is neither HIGH, MEDIUM OR LOW.  Density is " + density, ToastLength.Long).Show ();
        }

2
Bitte geben Sie nicht nur Code aus, sondern erklären Sie, was Sie getan haben und wie dies hilft
David Medenjak

2

Versuchen Sie diese Funktion isLayoutSizeAtLeast (int screenSize)

Um einen kleinen Bildschirm zu überprüfen, mindestens 320x426 dp und mehr getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);

Um den normalen Bildschirm zu überprüfen, mindestens 320x470 dp und mehr getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);

Um einen großen Bildschirm zu überprüfen, mindestens 480 x 640 dp und mehr getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);

Um einen besonders großen Bildschirm zu überprüfen, mindestens 720 x 960 dp und mehr getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);


Nett! Diese Methode ist bereits ab API Level 11 verfügbar!
Enselic

2

Wenn Sie 2018 Jeffs Antwort in Kotlin benötigen, finden Sie sie hier:

  private fun determineScreenSize(): String {
    // Thanks to https://stackoverflow.com/a/5016350/2563009.
    val screenLayout = resources.configuration.screenLayout
    return when {
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_SMALL -> "Small"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_NORMAL -> "Normal"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_LARGE -> "Large"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_XLARGE -> "Xlarge"
      screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK == Configuration.SCREENLAYOUT_SIZE_UNDEFINED -> "Undefined"
      else -> error("Unknown screenLayout: $screenLayout")
    }
  }

1

Könnten Sie dies nicht mit einer Zeichenfolgenressource und Aufzählungen tun? Sie können eine Zeichenfolgenressource definieren, die den Namen der Bildschirmgröße hat, z. B. SMALL, MEDIUM oder LARGE. Dann können Sie den Wert der Zeichenfolgenressource verwenden, um eine Instanz der Aufzählung zu erstellen.

  1. Definieren Sie in Ihrem Code eine Aufzählung für die verschiedenen Bildschirmgrößen, die Sie interessieren.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. Definieren Sie eine Zeichenfolgenressource, z. B. Bildschirmgröße, deren Wert entweder SMALL, MEDIUM oder LARGE ist.

    <string name="screensize">MEDIUM</string>
  3. Fügen screensizeSie in jeder Dimension, die Sie interessiert, eine Kopie von in eine Zeichenfolgenressource ein.
    Beispiel: <string name="screensize">MEDIUM</string>Gehen Sie zu values-sw600dp / strings.xml und values-medium / strings.xml und <string name="screensize">LARGE</string>gehen Sie zu sw720dp / strings.xml und values-large / strings.xml.
  4. Schreiben Sie in Code
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

Das war vielversprechend ... Ich habe jedoch mit 3 Geräten getestet und das Tablet gibt immer noch KLEIN zurück, wenn ich GROSS erwarte. Meine string.xml-Dateien werden in den Werten -h1024dp, values-h700dp und values-h200dp mit den entsprechenden <string name = "screenize"> xxxxxx </ string>
A. Masson

1

Kopieren Sie diesen Code und fügen Sie ihn in Ihren ein. ActivityWenn er ausgeführt wird, wird Toastdie Bildschirmgrößenkategorie des Geräts angezeigt.

int screenSize = getResources().getConfiguration().screenLayout &
        Configuration.SCREENLAYOUT_SIZE_MASK;

String toastMsg;
switch(screenSize) {
    case Configuration.SCREENLAYOUT_SIZE_LARGE:
        toastMsg = "Large screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_NORMAL:
        toastMsg = "Normal screen";
        break;
    case Configuration.SCREENLAYOUT_SIZE_SMALL:
        toastMsg = "Small screen";
        break;
    default:
        toastMsg = "Screen size is neither large, normal or small";
}
Toast.makeText(this, toastMsg, Toast.LENGTH_LONG).show();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.