Bagaimana cara menentukan kategori ukuran layar perangkat (kecil, normal, besar, xlarge) menggunakan kode?

308

Apakah ada cara untuk menentukan kategori ukuran layar perangkat saat ini, seperti kecil, normal, besar, xlarge?

Bukan kepadatan, tapi ukuran layar.

vieux
sumber

Jawaban:

420

Anda bisa menggunakan Configuration.screenLayoutbitmask.

Contoh:

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

}
Jeff Gilfelt
sumber
31
Untuk mendapatkan deteksi x-besar, pastikan Anda menggunakan target android-3.0 di proyek Anda. Atau gunakan nilai statis 4 untuk x-besar.
Peterdk
5
Beberapa perangkat dapat memiliki ukuran layar yang TIDAK DIKETAHUI, jadi dapat bermanfaat juga periksa dengan Konfigurasi. SCREENLAYOUT_SIZE_UNDEFINED.
valerybodak
Bisakah Anda menggunakan> = untuk mendapatkan layar besar atau lebih besar?
Andrew S
150

Kode di bawah menyempurnakan jawaban di atas, menampilkan ukuran layar sebagai 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();
}

Kode di bawah ini menampilkan kepadatan layar sebagai 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();
}
Mel
sumber
Bersulang bagus untuk deving.
MinceMan
dapatkah seseorang mengonfirmasi ekstra besar?
Nathan H
68

Jawaban Jeff Gilfelt sebagai metode pembantu statis:

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";
    }
}
qwertzguy
sumber
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";
    }
}
Pawan Maheshwari
sumber
1
Ini mendapatkan kepadatan layar. Pertanyaannya menentukan "Bukan kepadatan, tetapi ukuran layar."
Subaru Tashiro
11

Terima kasih atas jawaban di atas, yang banyak membantu saya :-) Tetapi bagi mereka (seperti saya) yang dipaksa untuk tetap mendukung Android 1.5, kita dapat menggunakan refleksi java untuk kompatibel mundur:

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
    ...
}
A. Masson
sumber
2
Anda dapat menargetkan versi terbaru platform dan referensi konstanta dari Configurationkelas. Ini adalah nilai akhir statis yang akan digariskan pada waktu kompilasi (yaitu, mereka akan digantikan oleh nilai aktualnya), sehingga kode Anda tidak akan rusak pada versi platform yang lebih lama.
Karakuri
Bagus saya tidak tahu itu ... Apakah Anda berbicara tentang android: targetSdkVersion?
A. Masson
1
Ya, itu bagaimana Anda akan menargetkan versi tertentu. Kebanyakan orang (setidaknya yang telah saya lihat) mengatur mereka targetSdkVersionke rilis terbaru.
Karakuri
9

Jika Anda ingin dengan mudah mengetahui kepadatan layar dan ukuran perangkat Android, Anda dapat menggunakan aplikasi gratis ini (tidak memerlukan izin): https://market.android.com/details?id=com.jotabout.screeninfo

mmathieum
sumber
3
Pertanyaan ini bukan tentang perangkat tertentu, ini tentang pemrograman untuk beberapa profil divice (yang merupakan proses pengembangan perangkat lunak yang penting ketika berkembang untuk platform seluler).
mtmurdock
1
aplikasi bagus untuk mengetahui tersedia di pasar - juga akan menyenangkan untuk melihat kode yang digunakan aplikasi untuk mendapatkan info itu
Stan Kurdziel
4
@StanKurdziel Kode sumber diterbitkan di bawah lisensi sumber terbuka MIT dan tersedia di: github.com/mportuesisf/ScreenInfo
mmathieum
Tautan ini sudah mati sekarang
Vadim Kotov
5

Perlu memeriksa layar xlarge & x..kepadatan tinggi? Ini adalah kode yang diubah dari jawaban yang dipilih.

//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();
}
Tom McFarlin
sumber
[Kepadatan] Dalam hal ini Anda harus beraktivitas. Jika Anda berada di luar, gunakan getWindowManager () kode ini WindowManager windowManager = (WindowManager) konteks .getSystemService (Konteks.WINDOW_SERVICE);
horkavlna
3

Berikut adalah jawaban Tom McFarlin versi Xamarin.Android

        //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 ();
        }
ellechino
sumber
2
Tolong jangan hanya membuang beberapa kode tetapi jelaskan apa yang telah Anda lakukan dan bagaimana ini membantu
David Medenjak
2

Coba fungsi ini isLayoutSizeAtLeast (int screenSize)

Untuk memeriksa layar kecil, minimal 320x426 dp dan di atas getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_SMALL);

Untuk memeriksa layar normal, minimal 320x470 dp dan di atas getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_NORMAL);

Untuk memeriksa layar besar, minimal 480x640 dp dan di atas getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_LARGE);

Untuk memeriksa layar ekstra besar, minimal 720x960 dp dan di atas getResources (). GetConfiguration (). IsLayoutSizeAtLeast (Configuration.SCREENLAYOUT_SIZE_XLARGE);

Devendra Vaja
sumber
Bagus! Metode itu tersedia sedini API level 11 juga!
Enselic
2

Pada tahun 2018, jika Anda membutuhkan jawaban Jeff di Kotlin, ini dia:

  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")
    }
  }
Thuy Trinh
sumber
1

Tidak bisakah Anda melakukan ini menggunakan sumber daya string dan enum? Anda dapat menentukan sumber daya string yang memiliki nama ukuran layar, seperti KECIL, MENENGAH, atau BESAR. Kemudian Anda bisa menggunakan nilai sumber daya string untuk membuat turunan enum.

  1. Tentukan Enum dalam kode Anda untuk berbagai ukuran layar yang Anda pedulikan.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. Tentukan sumber daya string, katakan screensize, yang nilainya akan menjadi KECIL, MENENGAH, atau BESAR.

    <string name="screensize">MEDIUM</string>
  3. Masukkan salinan screensizedalam sumber daya string di setiap dimensi yang Anda sayangi.
    Sebagai contoh, <string name="screensize">MEDIUM</string>akan masuk dalam nilai-sw600dp / strings.xml dan values-medium / strings.xml dan<string name="screensize">LARGE</string> akan masuk dalam sw720dp / strings.xml dan nilai-besar / strings.xml.
  4. Dalam kode, tulis
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);
Prof Mo
sumber
Ini menjanjikan ... Namun saya telah menguji dengan 3 perangkat dan tablet masih kembali KECIL ketika saya mengharapkan BESAR. File string.xml saya didefinisikan di dalam values-h1024dp, values-h700dp dan values-h200dp dengan <string name = "screensize"> xxxxxx </string> yang sesuai
A. Masson
1

Salin dan tempel kode ini ke Anda Activitydan ketika dijalankan akan Toastkategori ukuran layar perangkat.

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();
Alireza Ghanbarinia
sumber