Làm cách nào để xác định danh mục kích thước màn hình thiết bị (nhỏ, bình thường, lớn, xlộng) bằng cách sử dụng mã?


308

Có cách nào để xác định danh mục kích thước màn hình của thiết bị hiện tại, chẳng hạn như nhỏ, bình thường, lớn, xlộng không?

Không phải mật độ, mà là kích thước màn hình.

Câu trả lời:


420

Bạn có thể sử dụng Configuration.screenLayoutbitmask.

Thí dụ:

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

}

31
Để có được phát hiện lớn, hãy đảm bảo bạn sử dụng mục tiêu android-3.0 trong dự án của mình. Hoặc sử dụng giá trị tĩnh 4 cho x-lớn.
Peterdk

5
Một số thiết bị có thể có kích thước màn hình UNDEFINED, do đó, cũng có thể hữu ích khi kiểm tra với Cấu hình.SCREENLAYOUT_SIZE_UNDEFINED.
valerybodak

Bạn có thể sử dụng> = để có được màn hình lớn hơn hoặc lớn hơn không?
Andrew S

150

Mã dưới đây làm sáng tỏ câu trả lời ở trên, hiển thị kích thước màn hình dưới dạng 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();
}

Mã này dưới đây hiển thị mật độ màn hình dưới dạng 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();
}

Bánh mì nướng là tốt đẹp cho deving.
MinceMan

ai đó có thể xác nhận thêm lớn?
Nathan H

68

Câu trả lời của Jeff Gilfelt như một phương pháp trợ giúp tĩnh:

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
Điều này nhận được mật độ của màn hình. Câu hỏi chỉ định "Không phải mật độ, mà là kích thước màn hình."
Subaru Tashiro

11

Cảm ơn các câu trả lời ở trên, điều đó đã giúp tôi rất nhiều :-) Nhưng đối với những người (như tôi) buộc phải vẫn hỗ trợ Android 1.5, chúng tôi có thể sử dụng phản chiếu java để tương thích ngược:

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
Bạn có thể nhắm mục tiêu phiên bản mới nhất của nền tảng và tham chiếu các hằng số từ Configurationlớp. Đây là các giá trị tĩnh cuối cùng sẽ được nội tuyến tại thời gian biên dịch (nghĩa là chúng sẽ được thay thế bằng các giá trị thực của chúng), vì vậy mã của bạn sẽ không bị hỏng trên các phiên bản cũ hơn của nền tảng.
Karakuri

Rất vui, tôi không biết rằng ... Bạn đang nói về Android: targetSdkVersion?
A. Masson

1
Vâng, đó là cách bạn sẽ nhắm mục tiêu một phiên bản cụ thể. Hầu hết mọi người (ít nhất là tôi đã thấy) đặt targetSdkVersionbản phát hành mới nhất của họ .
Karakuri

9

Nếu bạn muốn dễ dàng biết mật độ và kích thước màn hình của thiết bị Android, bạn có thể sử dụng ứng dụng miễn phí này (không cần sự cho phép): https://market.android.com/details?id=com.jotabout.screeninfo


3
Câu hỏi này không phải là về một thiết bị cụ thể, mà là về lập trình cho nhiều cấu hình divice (đây là một quá trình phát triển phần mềm quan trọng khi phát triển cho các nền tảng di động).
mtmurdock

1
ứng dụng tốt cần biết có sẵn trên thị trường - cũng sẽ rất tuyệt khi thấy mã mà ứng dụng sử dụng để đưa ra thông tin của nó
Stan Kurdziel

4
@StanKurdziel Mã nguồn được xuất bản theo giấy phép nguồn mở MIT và có sẵn tại: github.com/mportuesisf/ScreenInfo
mmathieum

Liên kết này đã chết ngay bây giờ
Vadim Kotov

5

Cần kiểm tra màn hình xlộng & mật độ x x cao? Đây là mã thay đổi từ câu trả lời được chọn.

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

[Mật độ] Trong trường hợp này, bạn cần phải hoạt động. Nếu bạn ở bên ngoài, hãy sử dụng getWindowManager () mã này WindowManager windowManager = (WindowManager) bối cảnh .getSystemService (Context.WINDOW_SERVICE);
horkavlna

3

Đây là phiên bản Xamarin.Android của câu trả lời của Tom McFarlin

        //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
Xin đừng bỏ một số mã nhưng giải thích những gì bạn đã làm và làm thế nào để giúp đỡ
David Medenjak

2

Hãy thử chức năng này làLayoutSizeAtLeast (int screenSize)

Để kiểm tra màn hình nhỏ, ít nhất 320x426 dp trở lên getResource (). GetConfiguration (). IsLayoutSizeAtLeast (Cấu hình.SCREENLAYOUT_SIZE_SMALL);

Để kiểm tra màn hình bình thường, ít nhất 320x470 dp trở lên getResource (). GetConfiguration (). IsLayoutSizeAtLeast (Cấu hình.SCREENLAYOUT_SIZE_NORMAL);

Để kiểm tra màn hình lớn, ít nhất 480x640 dp trở lên getResource (). GetConfiguration (). IsLayoutSizeAtLeast (Cấu hình.SCREENLAYOUT_SIZE_LARGE);

Để kiểm tra màn hình lớn hơn, ít nhất 720x960 dp trở lên getResource (). GetConfiguration (). IsLayoutSizeAtLeast (Cấu hình.SCREENLAYOUT_SIZE_XLARGE);


Đẹp! Phương pháp đó có sẵn sớm nhất là API cấp 11!
Enselic

2

Năm 2018, nếu bạn cần câu trả lời của Jeff trong Kotlin, thì đây là:

  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

Bạn không thể làm điều này bằng cách sử dụng tài nguyên chuỗi và enums? Bạn có thể xác định tài nguyên chuỗi có tên của kích thước màn hình, chẳng hạn như NHỎ, TRUNG BÌNH hoặc LỚN. Sau đó, bạn có thể sử dụng giá trị của tài nguyên chuỗi để tạo một thể hiện của enum.

  1. Xác định một Enum trong mã của bạn cho các kích thước màn hình khác nhau mà bạn quan tâm.

    public Enum ScreenSize {
        SMALL,
        MEDIUM,
        LARGE,;
    }
  2. Xác định tài nguyên chuỗi, giả sử sàng lọc, có giá trị sẽ là NHỎ, TRUNG BÌNH hoặc LỚN.

    <string name="screensize">MEDIUM</string>
  3. Đặt một bản sao của screensizetài nguyên chuỗi theo từng chiều bạn quan tâm.
    Ví dụ: <string name="screensize">MEDIUM</string>sẽ đi vào các giá trị-sw600dp / chuỗi.xml và giá trị trung bình / chuỗi.xml và<string name="screensize">LARGE</string> sẽ đi vào sw720dp / String.xml và value-Large / String.xml.
  4. Trong mã, viết
    ScreenSize size = ScreenSize.valueOf(getReources().getString(R.string.screensize);

Điều này rất hứa hẹn ... Tuy nhiên, tôi đã thử nghiệm với 3 thiết bị và máy tính bảng vẫn quay trở lại NHỎ khi tôi mong đợi LỚN. Các tệp string.xml của tôi được xác định bên trong các giá trị-h1024dp, value-h700dp và value-h200dp với <string name = "Screensize"> xxxxxx </ string>
A. Masson

1

Sao chép và dán mã này vào mã của bạn Activityvà khi được thực thi, nó sẽ Toastphân loại kích thước màn hình của thiết bị.

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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.