Kod kullanarak cihaz ekran boyutu kategorisi (küçük, normal, büyük, xlarge) nasıl belirlenir?


308

Küçük, normal, büyük, xlarge gibi mevcut cihazın ekran boyutu kategorisini belirlemenin bir yolu var mı?

Yoğunluk değil, ekran boyutu.

Yanıtlar:


420

Configuration.screenLayoutBit maskesini kullanabilirsiniz .

Misal:

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

}

31
X-büyük algılama elde etmek için, projenizde hedef android-3.0 kullandığınızdan emin olun. Veya x-large için statik değeri 4 kullanın.
Peterdk

5
Bazı cihazların UNDEFINED boyutunda bir ekranı olabilir, bu yüzden Configuration.CREENLAYOUT_SIZE_UNDEFINED ile kontrol etmek de yararlı olabilir.
valerybodak

Ekranları büyütmek veya büyütmek için> = kullanabilir misiniz?
Andrew S

150

Aşağıdaki kod, yukarıdaki cevabı işaretleyerek ekran boyutunu Tost olarak gösterir.

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

Aşağıdaki bu kod ekran yoğunluğunu Tost olarak gösterir .

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

Tost deving için güzel.
MinceMan

birisi ekstra büyük mü teyit edebilir mi?
Nathan H

68

Jeff Gilfelt'in statik bir yardımcı yöntem olarak cevabı:

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
Bu, ekranın yoğunluğunu alır. Soru, "Yoğunluğu değil, ekran boyutunu" belirtir.
Subaru Tashiro

11

Yukarıdaki cevaplar için teşekkürler, bu bana çok yardımcı oldu :-) Ama yine de (benim gibi) Android 1.5'i desteklemeye zorlananlar için geriye doğru uyumlu java yansımasını kullanabiliriz:

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
Platformun en son sürümünü hedefleyebilir ve Configurationsınıftaki sabitlere başvurabilirsiniz . Bunlar, derleme zamanında satır içine alınacak statik son değerlerdir (yani, gerçek değerleriyle değiştirileceklerdir), böylece kodunuz platformun eski sürümlerinde bozulmayacaktır.
Karakuri

Güzel bilmiyordum ... Android hakkında mı konuşuyorsun: targetSdkVersion?
A.Mabson

1
Evet, belirli bir sürümü nasıl hedeflersiniz. Çoğu insan (en azından gördüğüm gibi) targetSdkVersionen son sürüme ayarladı .
Karakuri

9

Bir Android cihazın ekran yoğunluğunu ve boyutunu kolayca bilmek istiyorsanız, bu ücretsiz uygulamayı kullanabilirsiniz (izin gerekmez): https://market.android.com/details?id=com.jotabout.screeninfo


3
Bu soru belirli bir cihazla ilgili değil, çoklu bölme profilleri için programlama (mobil platformlar için geliştirirken önemli bir yazılım geliştirme süreci).
mtmurdock

1
bilmek için iyi bir uygulama piyasada mevcuttur - ayrıca uygulamanın bilgi ile gelmek için kullandığı kodu görmek güzel olurdu
Stan Kurdziel

4
@StanKurdziel Kaynak kodu MIT açık kaynak lisansı altında yayınlanır ve şu adresten edinilebilir: github.com/mportuesisf/ScreenInfo
mmathieum

Bu bağlantı şimdi öldü
Vadim Kotov

5

Xlarge ekranları ve x..high yoğunluklarını kontrol etmeniz mi gerekiyor? Bu, seçilen cevaptan değiştirilen koddur.

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

[Yoğunluk] Bu durumda faaliyette olmanız gerekir. Dışarıda iseniz getWindowManager () kullanın bu kod WindowManager windowManager = (WindowManager) context .getSystemService (Context.WINDOW_SERVICE);
horkavlna

3

İşte Tom McFarlin'in cevabının bir Xamarin.Android sürümü

        //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
Lütfen sadece bazı kodları
dökmeyin,

2

Bu işlevi deneyin isLayoutSizeAtLeast (int screenSize)

Küçük ekranı kontrol etmek için en az 320x426 dp ve üstü getResources (). GetConfiguration (). İsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);

Normal ekranı kontrol etmek için en az 320x470 dp ve üstü getResources (). GetConfiguration (). İsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);

Büyük ekranı kontrol etmek için en az 480x640 dp ve üstü getResources (). GetConfiguration (). İsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);

Ekstra büyük ekranı kontrol etmek için en az 720x960 dp ve üstü getResources (). GetConfiguration (). İsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);


Güzel! Bu yöntem API 11 düzeyinde de kullanılabilir!
Enselic

2

2018'de Jeff'in Kotlin'de cevabına ihtiyacınız varsa, işte burada:

  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

Bunu bir dize kaynağı ve numaralandırmalar kullanarak yapamaz mıydınız? SMALL, MEDIUM veya LARGE gibi ekran boyutu adına sahip bir dize kaynağı tanımlayabilirsiniz. Sonra numaralandırma örneği oluşturmak için dize kaynağının değerini kullanabilirsiniz.

  1. Değer verdiğiniz farklı ekran boyutları için kodunuzda bir Numaralandırma tanımlayın.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. Ekran boyutu diyelim, değeri KÜÇÜK, ORTA veya BÜYÜK olacak dize kaynağı tanımlayın.

    <string name="screensize">MEDIUM</string>
  3. Önem verdiğiniz screensizeher boyutta bir dize kaynağına bir kopyasını ekleyin .
    Örneğin, <string name="screensize">MEDIUM</string>değerler-sw600dp / strings.xml ve değerler-orta / strings.xml değerlerine <string name="screensize">LARGE</string>gider ve sw720dp / strings.xml ve değerler-büyük / strings.xml değerlerine gider.
  4. Kodda, yazın
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

Bu umut vericiydi ... Ancak 3 cihazla test ettim ve BÜYÜK beklediğimde tablet hala KÜÇÜK dönüyor. String.xml dosyalarım, değerler-h1024dp, değerler-h700dp ve değerler-h200dp içinde, karşılık gelen <string name = "screensize"> xxxxxx </string>
A. Masson

1

Bu kodu kopyalayıp kendinize yapıştırın Activityve yürütüldüğünde Toastcihazın ekran boyutu kategorisi olacaktır.

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.