Làm cách nào để tải ScreenSize theo lập trình trong Android


75

Android xác định kích thước màn hình là XLarge lớn bình thường, v.v.

Nó tự động chọn giữa các tài nguyên tĩnh trong các thư mục thích hợp. Tôi cần dữ liệu này về thiết bị hiện tại trong mã java của mình. DisplayMetrics chỉ cung cấp thông tin về mật độ thiết bị hiện tại. Không có gì có sẵn liên quan đến kích thước màn hình.

Tôi đã tìm thấy enum ScreenSize trong mã grep ở đây Tuy nhiên, điều này dường như không khả dụng với tôi cho 4.0 SDK. Có cách nào để lấy thông tin này không?

Câu trả lời:


118

Sao chép và dán mã này vào của bạn Activityvà khi nó đượ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();

14
Tôi đã sử dụng cái này ở trên và chạy nó giả lập khác nhau như lớn, vừa, nhỏ. nhưng tôi nhận được bánh mì nướng màn hình bình thường..làm thế nào để giải quyết nó
Palaniraja

59
private static String getScreenResolution(Context context)
{
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);
    int width = metrics.widthPixels;
    int height = metrics.heightPixels;

    return "{" + width + "," + height + "}";
}

1
mã của bạn đang đưa ra kết quả không bao gồm các nút cảm ứng mềm ở dưới cùng và thanh trạng thái và thanh công cụ ở trên cùng @David
Umar Ata

Chính xác những gì tôi muốn! Hoạt động như một sự quyến rũ
Itoun

Cảm ơn. Mã này hoạt động tốt đối với tôi trên điện thoại và máy tính bảng giả lập Android. Nhưng khi tôi xoay máy tính bảng, các số độ phân giải không bị đảo ngược thay vào đó giá trị thực là những thay đổi. Nhưng đối với điện thoại, nó hoạt động tốt. Làm sao tôi có thể giải quyết việc này?
SAIFI369

14

Xác định kích thước màn hình:

int screenSize = getResources().getConfiguration().screenLayout &Configuration.SCREENLAYOUT_SIZE_MASK;
  switch(screenSize) {
      case Configuration.SCREENLAYOUT_SIZE_LARGE:
        Toast.makeText(this, "Large screen",Toast.LENGTH_LONG).show();
         break;
       case Configuration.SCREENLAYOUT_SIZE_NORMAL:
          Toast.makeText(this, "Normal screen",Toast.LENGTH_LONG).show();
           break;
       case Configuration.SCREENLAYOUT_SIZE_SMALL:
           Toast.makeText(this, "Small screen",Toast.LENGTH_LONG).show();
           break;
       default:
           Toast.makeText(this, "Screen size is neither large, normal or small" , Toast.LENGTH_LONG).show();

 }

Xác định mật độ:

int density= getResources().getDisplayMetrics().densityDpi;
   switch(density)
  {
  case DisplayMetrics.DENSITY_LOW:
     Toast.makeText(context, "LDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_MEDIUM:
       Toast.makeText(context, "MDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_HIGH:
      Toast.makeText(context, "HDPI", Toast.LENGTH_SHORT).show();
      break;
  case DisplayMetrics.DENSITY_XHIGH:
       Toast.makeText(context, "XHDPI", Toast.LENGTH_SHORT).show();
      break;
  }

cho Tham khảo: http://devl-android.blogspot.in/2013/10/wifi-connectivity-and-hotspot-in-android.html


2
Mặc dù liên kết này có thể trả lời câu hỏi, nhưng tốt hơn hết bạn nên đưa các phần thiết yếu của câu trả lời vào đây và cung cấp liên kết để tham khảo. Các câu trả lời chỉ có liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
JoseK

Liên kết đã đăng không chính xác. Liên kết chính xác đến cùng một nguồn được tìm thấy tại đây: devl-android.blogspot.com/2013/10/… . Ngoài ra, đối với những người bạn sử dụng Kotlin, '&' được dịch thành 'và'.
Panos Gr

4

Tôi nghĩ đó là một đoạn mã đơn giản khá dễ hiểu!

public Map<String, Integer> deriveMetrics(Activity activity) {
    try {
        DisplayMetrics metrics = new DisplayMetrics();

        if (activity != null) {
            activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        }

        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("screenWidth", Integer.valueOf(metrics.widthPixels));
        map.put("screenHeight", Integer.valueOf(metrics.heightPixels));
        map.put("screenDensity", Integer.valueOf(metrics.densityDpi));

        return map;
    } catch (Exception err) {
        ; // just use zero values
        return null;
    }
}

Phương pháp này bây giờ có thể được sử dụng ở bất cứ đâu một cách độc lập. Bất cứ nơi nào bạn muốn lấy thông tin về màn hình thiết bị, hãy làm như sau:

        Map<String, Integer> map = deriveMetrics2(this);
        map.get("screenWidth");
        map.get("screenHeight");
        map.get("screenDensity");

Hy vọng điều này có thể hữu ích cho ai đó ngoài kia và có thể thấy nó dễ sử dụng hơn. Nếu tôi cần sửa lại hoặc cải thiện, vui lòng cho tôi biết! :-)

Chúc mừng !!!


Cảm ơn. Mã này hoạt động tốt đối với tôi trên điện thoại và máy tính bảng giả lập Android. Nhưng khi tôi xoay máy tính bảng, các số độ phân giải không bị đảo ngược thay vào đó giá trị thực là những thay đổi. Nhưng đối với điện thoại, nó hoạt động tốt. Làm sao tôi có thể giải quyết việc này?
SAIFI369

4
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width = displayMetrics.widthPixels;

int height = displayMetrics.heightPixels;

Cảm ơn. Mã này hoạt động tốt đối với tôi trên điện thoại và máy tính bảng giả lập Android. Nhưng khi tôi xoay máy tính bảng, các số độ phân giải không bị đảo ngược thay vào đó giá trị thực là những thay đổi. Nhưng đối với điện thoại, nó hoạt động tốt. Làm sao tôi có thể giải quyết việc này?
SAIFI369

3

Bạn có thể nhận kích thước hiển thị bằng pixel bằng cách sử dụng mã này.

Display display = getWindowManager().getDefaultDisplay();
SizeUtils.SCREEN_WIDTH = display.getWidth();
SizeUtils.SCREEN_HEIGHT = display.getHeight();

3
Đây không phải là những gì OP đang yêu cầu.
Alex Lockwood

getHeightgetWidthkhông được dùng nữa kể từ API 16: Android 4.1 (Jelly Bean)
Bruno Bieri 12/09/19

3

Các cách để tải DisplayMetrics:

1.

val dm = activity.resources.displayMetrics
val dm = DisplayMetrics() 
activity.windowManager.defaultDisplay.getMetrics(dm)
  1. val dm = DisplayMetrics () val wm = context.getSystemService (Context.WINDOW_SERVICE) as WindowManager wm..defaultDisplay.getMetrics (dm)

Sau đó nhận được

Mật độ màn hình được biểu thị bằng số chấm trên inch. Có thể là DENSITY_LOW, DENSITY_MEDIUM hoặc DENSITY_HIGH

dm.densityDpi

Chiều cao tuyệt đối của kích thước hiển thị có sẵn tính bằng pixel.

dm.heightPixels

Chiều rộng tuyệt đối của kích thước hiển thị có sẵn tính bằng pixel.

dm.widthPixels

Pixel vật lý chính xác trên mỗi inch của màn hình trong kích thước X.

dm.xdpi

Các pixel vật lý chính xác trên mỗi inch của màn hình trong kích thước Y.

dm.ydpi

DisplayMetrics


2

Bạn có thể thử điều này, Nó đang hoạt động Ví dụ

DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int ht = displaymetrics.heightPixels;
int wt = displaymetrics.widthPixels;

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

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

 // These are deprecated
 Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
    .getDefaultDisplay();
 int  width = display.getWidth();
 int height = display.getHeight();

2

Với đồ trang trí (bao gồm cả thanh nút):

private static String getScreenResolution(Context context) {
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRealMetrics(metrics);
    return "{" + metrics.widthPixels + "," + metrics.heightPixels + "}";
}

Không có đồ trang trí:

private static String getScreenResolution(Context context) {
    DisplayMetrics metrics = new DisplayMetrics();
    ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metrics);
    return "{" + metrics.widthPixels + "," + metrics.heightPixels + "}";
}

Sự khác biệt là phương thức getMetrics () so với getRealMetrics () của lớp Display.


1

simon-

Các kích thước màn hình khác nhau có mật độ điểm ảnh khác nhau. Màn hình 4 inch trên điện thoại của bạn có thể có nhiều hoặc ít pixel hơn, sau đó nói rằng TV 26 inch. Nếu tôi hiểu chính xác, anh ấy muốn phát hiện xem màn hình hiện tại thuộc nhóm kích thước nào, nhỏ, bình thường, lớn và cực lớn. Điều duy nhất tôi có thể nghĩ đến là phát hiện mật độ điểm ảnh và sử dụng nó để xác định kích thước thực của màn hình.


1

Tôi cần cái này cho một vài ứng dụng của mình và mã sau là giải pháp của tôi cho vấn đề. Chỉ hiển thị mã bên trong onCreate. Đây là một ứng dụng độc lập chạy trên mọi thiết bị để trả về thông tin màn hình.

setContentView(R.layout.activity_main);
    txSize = (TextView) findViewById(R.id.tvSize);

    density = (TextView) findViewById(R.id.density);
    densityDpi = (TextView) findViewById(R.id.densityDpi);
    widthPixels = (TextView) findViewById(R.id.widthPixels);
    xdpi = (TextView) findViewById(R.id.xdpi);
    ydpi = (TextView) findViewById(R.id.ydpi);

    Configuration config = getResources().getConfiguration();

    if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) {
        Toast.makeText(this, "Large screen", Toast.LENGTH_LONG).show();
        txSize.setText("Large screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) {
        Toast.makeText(this, "Normal sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Normal sized screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) {
        Toast.makeText(this, "Small sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Small sized screen");
    } else if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) {
        Toast.makeText(this, "xLarge sized screen", Toast.LENGTH_LONG)
                .show();
        txSize.setText("Small sized screen");
    } else {
        Toast.makeText(this,
                "Screen size is neither large, normal or small",
                Toast.LENGTH_LONG).show();
        txSize.setText("Screen size is neither large, normal or small");
    }

    Display display = getWindowManager().getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    Log.i(TAG, "density :" + metrics.density);
    density.setText("density :" + metrics.density);

    Log.i(TAG, "D density :" + metrics.densityDpi);
    densityDpi.setText("densityDpi :" + metrics.densityDpi);

    Log.i(TAG, "width pix :" + metrics.widthPixels);
    widthPixels.setText("widthPixels :" + metrics.widthPixels);

    Log.i(TAG, "xdpi :" + metrics.xdpi);
    xdpi.setText("xdpi :" + metrics.xdpi);

    Log.i(TAG, "ydpi :" + metrics.ydpi);
    ydpi.setText("ydpi :" + metrics.ydpi);

Và một tệp XML đơn giản

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >

<TextView
    android:id="@+id/tvSize"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/density"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/densityDpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/widthPixels"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/xdpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />
<TextView
    android:id="@+id/ydpi"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />


0

Nếu bạn đang ở trong một non-activity, tức là Fragment, Adapter, Model class hoặc bất kỳ lớp java nào khác không mở rộng Activityđơn giản getResources()sẽ không hoạt động. Bạn có thể sử dụng getActivity()trong phân đoạn hoặc sử dụng contextmà bạn chuyển cho lớp tương ứng.

mContext.getResources()

Tôi muốn khuyên bạn nên tạo một lớp nói Utils sẽ có phương thức / Phương thức cho công việc chung. Lợi ích của việc này là bạn có thể nhận được kết quả mong muốn với một dòng mã ở bất kỳ đâu trong ứng dụng gọi phương thức này.


0

Thuật toán bên dưới có thể được sử dụng để xác định danh mục nào sẽ được sử dụng để chọn giữa các tài nguyên tĩnh và cũng phục vụ cho mật độ cao XX và XXX mới hơn

    DisplayMetrics displayMetrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    mDensityDpi = displayMetrics.densityDpi;
    mDensity = displayMetrics.density;
    mDisplayWidth = displayMetrics.widthPixels;
    mDisplayHeight = displayMetrics.heightPixels;

    String densityStr = "Unknown";
    int difference, leastDifference = 9999;

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_LOW);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "LOW";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_MEDIUM);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "MEDIUM";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_HIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "HIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XHIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "XHIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XXHIGH);
    if (difference < leastDifference) {
        leastDifference = difference;
        densityStr = "XXHIGH";
    }

    difference = Math.abs(mDensityDpi - DisplayMetrics.DENSITY_XXXHIGH);
    if (difference < leastDifference) {
        densityStr = "XXXHIGH";
    }

    Log.i(TAG, String.format("Display [h,w]: [%s,%s] Density: %s Density DPI: %s [%s]", mDisplayHeight, mDisplayWidth, mDensity, mDensityDpi, densityStr));

0

Nhận độ phân giải màn hình hoặc kích thước màn hình trong Kotlin

fun getScreenResolution(context: Context): Pair<Int, Int> {
    try {
        val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = wm.defaultDisplay
        val metrics = DisplayMetrics()
        display.getMetrics(metrics)
        val width = metrics.widthPixels
        val height = metrics.heightPixels
        //Log.d(AppData.TAG, "screenSize: $width, $height")
        return Pair(width, height)

    } catch (error: Exception) {
        Log.d(AppData.TAG, "Error : autoCreateTable()", error)
    }

    return Pair(0, 0)
}

0

Mã sẽ cung cấp cho bạn kết quả ở định dạng sau: chiều rộng x chiều cao

String displayResolution = getResources().getDisplayMetrics().widthPixels + "x" + getResources().getDisplayMetrics().heightPixels;

Điều gì sẽ xảy ra nếu thiết bị OP đang sử dụng nó không phải là 1440x2560? Câu trả lời của bạn nên cụ thể hơn. Mã có thể tốt, nhưng mô tả sẽ không phải lúc nào cũng hợp lệ.
Magiczne

@Magiczne cảm ơn bạn đã nhận xét có giá trị. Tôi đã chỉnh sửa câu trả lời của mình
Alice Iceberg
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.