Cách lấy kích thước màn hình dưới dạng pixel trong Android


1843

Tôi đã tạo một số thành phần tùy chỉnh và tôi muốn lập trình chúng ở góc trên bên phải ( npixel từ cạnh trên và mpixel từ cạnh phải). Do đó, tôi cần lấy chiều rộng màn hình và chiều cao màn hình rồi đặt vị trí:

int px = screenWidth - m;
int py = screenHeight - n;

Làm thế nào để tôi có được screenWidthscreenHeighttrong Hoạt động chính?


Sử dụng dp thay vì px. bởi vì nó sẽ làm biến dạng bố cục của bạn với các thiết bị khác ..
Jawad Zeb

Đừng quên nhân với getResource (). GetDisplayMetrics (). Mật độ để tính tỷ lệ hiển thị
jmaculation

Điều này chứng tỏ câu trả lời được bình chọn nhiều nhất không phải lúc nào cũng tốt nhất (& rất nhiều người lặp lại câu trả lời cho đại diện). Thay vì kết hợp getSize và phản đối getWidth / getHeight (bỏ qua lỗi), hãy thử Balaji.K's getMetrics. Nhận xét của Nik trong câu trả lời của anh ấy thậm chí còn giải thích getDisplayMetricsđể xem xét kích thước thanh hệ thống / trạng thái. Ngoài ra, bạn có thể sử dụng mật độ như jmaculation và LoungeKatt giải thích để có giá trị CHÍNH XÁC : DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;Đã thử nghiệm trong Android v2.2 (API 8) và v4.0 với kết quả tốt và không có lỗi / cảnh báo .
Armfoot

DisplayMetrics displaymetrics = new DisplayMetrics (); getWindowManager (). getDefaultDisplay (). getMetrics (displaymetrics); int height = displaymetrics.heightPixels; int width = displaymetrics. thongPixels;
Azahar

một cách khác để lấy DisplayMetrics : Resources.getSystem().getDisplayMetrics(). Bạn sẽ không cần phải Contextcó được chúng.
Täg

Câu trả lời:


3479

Nếu bạn muốn kích thước hiển thị bằng pixel, bạn có thể sử dụng getSize:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

Nếu bạn không ở trong một Activitybạn có thể lấy mặc định Displayqua WINDOW_SERVICE:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();

Nếu bạn đang ở trong một đoạn và muốn hoàn thành việc này, chỉ cần sử dụng Activity.WindowManager (trong Xamarin.Android) hoặc getActivity (). GetWindowManager () (trong java).

Trước khi getSizeđược giới thiệu (trong API cấp 13), bạn có thể sử dụng getWidthgetHeightcác phương thức hiện không dùng nữa:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();  // deprecated
int height = display.getHeight();  // deprecated

Đối với trường hợp sử dụng mà bạn mô tả, tuy nhiên, phần lề / phần đệm trong bố cục có vẻ phù hợp hơn.

Một cách khác là: DisplayMetrics

Một cấu trúc mô tả thông tin chung về màn hình, chẳng hạn như kích thước, mật độ và tỷ lệ phông chữ của nó. Để truy cập các thành viên DisplayMetrics, hãy khởi tạo một đối tượng như thế này:

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

Chúng tôi có thể sử dụng widthPixelsđể có được thông tin cho:

"Độ rộng tuyệt đối của màn hình tính bằng pixel."

Thí dụ:

Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);

13
getWidth () hoặc getSize ()? Tôi sẽ sử dụng gì nếu tôi cần ứng dụng của mình chạy trên API <13 cũng như API> 13?
Carol

52
thử {display.getSize (kích thước); chiều rộng = kích thước.x; chiều cao = kích thước.y; } Catch (NoSuchMethodError e) {width = display.getWidth (); chiều cao = display.getHeight (); }
Arnaud

248
Tôi không thấy lý do tại sao bạn muốn sử dụng try/catchcho một kiểm tra như vậy? Tại sao không chỉ đơn giản là sử dụng if (android.os.Build.VERSION.SDK_INT >= 13)mà không có bất kỳ ngoại lệ ném nào cả? Tôi nghĩ rằng try/catchtrong một luồng ứng dụng bình thường là thực tiễn xấu.
Patrik

2
@ A-Live thì ứng dụng cũng sẽ bị hỏng (nhưng không bị sập). Tuy nhiên, các nhà phát triển của chúng tôi phải kiểm tra trước một phiên bản os mới và điều này có thể chỉ che giấu một vấn đề. Ngoài ra với đối số này, người ta có thể / nên bao quanh mỗi một vài dòng mã với thử / bắt, mà theo tôi là thực tiễn tồi tệ như đã đề cập.
Patrik

11
nếu bạn muốn lấy kích thước màn hình không bao gồm thanh điều hướng và / hoặc thanh thông báo
nhà phát triển Android

375

Một cách là:

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth();
int height = display.getHeight();

Nó không được dùng nữa và thay vào đó bạn nên thử đoạn mã sau. Hai dòng mã đầu tiên cung cấp cho bạn các DisplayMetricsobjecs. Đối tượng này chứa các trường như heightPixels, widthPixels.

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

int height = metrics.heightPixels;
int width = metrics.widthPixels;

14
Lưu ý rằng các số liệu (chiều rộng, chiều cao) thay đổi tùy thuộc vào vòng quay của thiết bị.
Tony Chan

8
Số liệu sẽ trả về kích thước của màn hình, nhưng HoneyComb trở lên, hoạt động của bạn sẽ có ít không gian hơn so với những gì được trả về do thanh hệ thống.
Guy

3
@Guy nó phụ thuộc vào việc thực hiện của bạn. Bạn có thể ẩn thanh trạng thái: requestWindowFeature (Window.FEATURE_NO_TITLE); getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Hagai L

79
Cũng tồn tại theo cách này: getContext (). GetResource (). GetDisplayMetrics (). WidthPixels
Nik

tỷ lệ float cuối cùng = getResource (). getDisplayMetrics (). mật độ; int width = (int) (metrics. thongPixels * scale + 0.5f); - Bạn phải tính đến mật độ thiết bị khi làm theo cách đó.
Giỏ hàng bị bỏ rơi

120

Nó có thể không trả lời câu hỏi của bạn, nhưng có thể hữu ích khi biết (tôi đã tự tìm kiếm câu hỏi này khi tôi đến câu hỏi này) rằng nếu bạn cần kích thước của Chế độ xem nhưng mã của bạn đang được thực thi khi bố cục của nó chưa được đặt ra (ví dụ như trong onCreate()), bạn có thể thiết lập một ViewTreeObserver.OnGlobalLayoutListenervới View.getViewTreeObserver().addOnGlobalLayoutListener()và đặt mã có liên quan mà cần chiều của quan điểm đó. Cuộc gọi lại của người nghe sẽ được gọi khi bố trí sẽ được đặt ra.


hoặc chỉ viết view.post
Lukas Hanacek

view.post không được đảm bảo để làm việc mặc dù. Nó chỉ là một cách giải quyết.
marsbear

@marsbear nơi mà nó nói View.post()không được đảm bảo để làm việc? Tôi tò mò vì tôi cũng dựa vào phương pháp này để có được kích thước của Chế độ xem sau khi bố trí và không biết rằng nó không đáng tin cậy.
Tony Chan

@Turbo Tôi nói rằng: p Chúng tôi đã sử dụng cách giải quyết đó trước đây và hóa ra là không đáng tin cậy. Cách giải quyết đó dựa trên giả định, rằng cách bố trí ban đầu được thực hiện trong cùng một lượt UIThread như khởi tạo. Do đó, bạn có thể lên lịch để mã của mình chạy trước khi UI tiếp theo chuyển qua post () và sẽ ổn. Hóa ra việc bố trí có thể mất nhiều thời gian hơn trong một số trường hợp nhất định và chế độ xem vẫn không được bố trí khi mã được đăng chạy. Những gì tôi làm bây giờ là thêm ViewTreeObserver trong onCreate và xóa nó sau onLayout đầu tiên. Bắt đầu công cụ của bạn trong ngày đầu tiên đó.
soái ca

@marsbear có vấn đề gì mà Viewbạn nhận được ViewTreeObservertừ? Hay tất cả họ đều chia sẻ cùng một?
Tony Chan

109

(Câu trả lời năm 2012, có thể đã hết hạn) Nếu bạn muốn hỗ trợ trước Honeycomb, bạn sẽ cần đặt khả năng tương thích ngược trước API 13. Một cái gì đó như:

int measuredWidth = 0;
int measuredHeight = 0;
WindowManager w = getWindowManager();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    Point size = new Point();
    w.getDefaultDisplay().getSize(size);
    measuredWidth = size.x;
    measuredHeight = size.y;
} else {
    Display d = w.getDefaultDisplay();
    measuredWidth = d.getWidth();
    measuredHeight = d.getHeight();
}

Tất nhiên, các phương thức không dùng nữa cuối cùng sẽ được đưa ra khỏi SDK gần đây nhất, nhưng mặc dù chúng tôi vẫn dựa vào hầu hết người dùng có Android 2.1, 2.2 và 2.3, đây là những gì chúng tôi còn lại.


Vâng, điều này đã trở lại vào năm 2012.
digiphd

xin lỗi, cho phép tôi làm rõ những gì tôi muốn nói Rất khó có ai có thể hỗ trợ API <14 kể từ
sudocoder

69

Tôi đã thử tất cả các "giải pháp" có thể không thành công và tôi nhận thấy rằng ứng dụng "Dalvik Explorer" của Elliott Hughes luôn hiển thị kích thước chính xác trên bất kỳ phiên bản thiết bị / HĐH Android nào. Cuối cùng tôi đã xem xét dự án nguồn mở của anh ấy có thể tìm thấy ở đây: https://code.google.com.vn/p/enh/

Đây là tất cả các mã có liên quan:

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
try {
    // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar)
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
try {
    // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar)
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

EDIT: phiên bản cải tiến nhẹ (tránh bắn ngoại lệ trên phiên bản HĐH không được hỗ trợ):

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}

9
Đây là bài viết duy nhất ở đây có tính đến các trang trí cửa sổ (thanh trạng thái / thanh menu). làm việc tuyệt vời cho tôi
Andy Cochrane

5
Tuyệt vời, tuy nhiên bạn không bao giờ nên có ngoại lệ cháy logic kinh doanh. Bắn ngoại lệ (ngay cả khi bị bắt) là khủng khiếp cho hiệu suất. Thêm vào đó, bạn đang làm nhiều việc hơn mức cần thiết nếu SDK_INT> 13. Thay vào đó, bạn chỉ nên thêm một số if trên Build.VERSION.SDK_INT.
Erik B

3
@Erik B, tôi đồng ý. Tôi đã thêm phiên bản cải tiến. Tuy nhiên, tôi vẫn để lại phần "kể từ SDK 1" trong trường hợp có sự cố xảy ra khi thử / bắt (Tôi đã thấy nhiều điều tồi tệ trong Android đặc biệt là khi bạn nghĩ rằng không thể có lỗi gì đó vì vậy tôi muốn giữ an toàn :)) . Dù sao, không nên có quá nhiều chi phí vì việc tính toán này chỉ nên được thực hiện một lần (ví dụ: các giá trị có thể được giữ trong một số thuộc tính tĩnh).
Dragan Marjanović

8
Lưu ý rằng mã này được cấp phép theo GPL v3 có ý nghĩa cho việc sử dụng trong các ứng dụng sản xuất.
TalkLittle

GPL và tùy thuộc vào sự phản chiếu để gọi các phương thức có thể không có trong các phiên bản Android trong tương lai. Mhhh
Michel

47

Cách đơn giản nhất:

 int screenHeight = getResources().getDisplayMetrics().heightPixels;
 int screenWidth = getResources().getDisplayMetrics().widthPixels; 

46

Để truy cập chiều cao của thanh trạng thái cho thiết bị Android, chúng tôi thích cách lập trình hơn để có được nó:

Mã mẫu

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    result = getResources().getDimensionPixelSize(resId);
}

Biến resultcho chiều cao trong pixel.

Để truy cập nhanh

Nhập mô tả hình ảnh ở đây

Để biết thêm thông tin về chiều cao của Title bar, Navigation barContent View, nhìn vui lòng vào Android màn hình thiết bị kích cỡ .


Đúng thứ tôi cần! getResources().getDisplayMetrics().heightPixels + resultcho chiều cao toàn màn hình thực tế. Câu trả lời của Dragan Marjanović cũng hoạt động nhưng tôi thích giải pháp đơn giản và ngắn gọn hơn nhiều này.
Michel

Cách tiếp cận này đã lỗi thời kể từ Android Marshmallow. Chiều cao thanh trạng thái có thể thay đổi từ thiết bị hoặc phiên bản Android. Sử dụng tốt hơn OnApplyWindowInsetsListener.
Heinrich

32

Trước tiên hãy xem (ví dụ: bởi findViewById()) và sau đó bạn có thể sử dụng getWidth () trên chính chế độ xem.


3
Đây thực sự là cách tài liệu yêu cầu bạn làm điều đó ... nhưng thật vô nghĩa nếu bạn KHÔNG sử dụng chế độ xem. bạn có thể đang sử dụng một cái gì đó khác, ví dụ: mglsurfaceview.
gcb

2
Điều này tốt hơn vì chế độ xem chính có thể không phải là kích thước của màn hình. Nhưng hãy chắc chắn rằng điều này được thực hiện tại điểm mà chế độ xem bạn đang truy vấn kích thước đã được bố trí, thường sẽ không nằm trong onCreate (). Bạn có thể sử dụng một cuộc gọi lại tùy chỉnh từ onWindowF FocusChanged (boolean hasF Focus) sẽ được gọi sau khi tất cả các chế độ xem được đo và cứ thế, đảm bảo bạn sẽ không nhận được kích thước không chính xác cho chế độ xem mà bạn quan tâm ...
Dori

27

Tôi có hai chức năng, một để gửi bối cảnh và chức năng khác nhận chiều cao và chiều rộng tính bằng pixel:

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // Deprecated
    }
    return width;
}

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>12){
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }
    else{
        height = display.getHeight();  // Deprecated
    }
    return height;
}

Bạn cần thêm @SuppressLint("NewApi")ngay phía trên chữ ký hàm để có thể biên dịch.
Adil Malik

Tôi nghĩ rằng tốt hơn là nên lấy chiều cao và chiều rộng trong một lần thay vì gọi các API riêng biệt vì nếu không chúng có thể không đồng bộ. Điều này có thể xảy ra nếu hướng màn hình thay đổi trong khi mã của bạn đang chạy.
Sam

17

Để mở rộng quy mô bằng cách sử dụng XML, có một thuộc tính được gọi là "android: layout_ weight"

Ví dụ dưới đây, được sửa đổi từ phản hồi của synic trên chuỗi này , hiển thị nút chiếm 75% màn hình (weight = 0,25) và chế độ xem văn bản chiếm 25% còn lại của màn hình (weight = 0,75).

<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight=".25"
        android:text="somebutton">

    <TextView android:layout_width="fill_parent"
        android:layout_height="Wrap_content"
        android:layout_weight=".75">
</LinearLayout>

17

Đây là mã tôi sử dụng cho nhiệm vụ:

// `activity` is an instance of Activity class.
Display display = activity.getWindowManager().getDefaultDisplay();
Point screen = new Point();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
    display.getSize(screen);
} else {            
    screen.x = display.getWidth();
    screen.y = display.getHeight();
}

Có vẻ đủ sạch và chưa, chăm sóc sự phản đối.


17

Đây không phải là một giải pháp tốt hơn nhiều sao? DisplayMetrics đi kèm với mọi thứ bạn cần và hoạt động từ API 1.

public void getScreenInfo(){
    DisplayMetrics metrics = new DisplayMetrics();
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);

    heightPixels = metrics.heightPixels;
    widthPixels = metrics.widthPixels;
    density = metrics.density;
    densityDpi = metrics.densityDpi;
}

Bạn cũng có thể có được màn hình thực tế (bao gồm cả kiểu dáng màn hình, chẳng hạn như Thanh trạng thái hoặc thanh điều hướng phần mềm) bằng cách sử dụng getRealMetrics , nhưng điều này chỉ hoạt động trên 17+.

Tui bỏ lỡ điều gì vậy?


1
Nó không trừ không gian cho các điều khiển trên màn hình (chẳng hạn như trên Máy tính bảng hoặc thiết bị Nexus). Ngoài ra, tôi nhận được một giá trị khác (750 so với 800) trên Máy tính bảng 10 "của mình, tùy thuộc vào việc Hoạt động có hoạt động khi tính toán được thực hiện hay không. Nhưng với mục đích của tôi, điều này còn hơn cả tốt. Cảm ơn bạn!
Steven L

15

Chỉ cần thêm vào câu trả lời của Francesco. Trình quan sát khác có nhiều apt hơn, nếu bạn muốn tìm ra vị trí trong cửa sổ hoặc vị trí trên màn hình là ViewTreeObserver.OnPreDrawListener ()

Điều này cũng có thể được sử dụng để tìm các thuộc tính khác của chế độ xem hầu như không xác định tại thời điểm onCreate (), ví dụ: vị trí cuộn, vị trí được chia tỷ lệ.


15

Sử dụng mã sau trong Hoạt động.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

15

Tìm chiều rộng và chiều cao của màn hình:

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

Sử dụng điều này, chúng tôi có thể nhận được SDK 13 mới nhất và cao hơn.

// New width and height
int version = android.os.Build.VERSION.SDK_INT;
Log.i("", " name == "+ version);
Display display = getWindowManager().getDefaultDisplay();
int width;
if (version >= 13) {
    Point size = new Point();
    display.getSize(size);
    width = size.x;
    Log.i("width", "if =>" +width);
}
else {
    width = display.getWidth();
    Log.i("width", "else =>" +width);
}

15
DisplayMetrics dimension = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dimension);
int w = dimension.widthPixels;
int h = dimension.heightPixels;

12

Tôi tìm thấy điều này đã lừa

Rect dim = new Rect();
getWindowVisibleDisplayFrame(dim);

5
Thật tuyệt nhưng đó là một điều đáng sợ về phương pháp này trong mã nguồn: nhận xét này
Norbert

12

Cần phải nói rằng, nếu bạn không tham gia Activity, nhưng trong View(hoặc có biến Viewloại trong phạm vi của bạn), thì không cần sử dụngWINDOW_SERVICE . Sau đó, bạn có thể sử dụng ít nhất hai cách.

Đầu tiên:

DisplayMetrics dm = yourView.getContext().getResources().getDisplayMetrics();

Thứ hai:

DisplayMetrics dm = new DisplayMetrics();
yourView.getDisplay().getMetrics(dm);

Tất cả các phương pháp này chúng tôi gọi ở đây không được phản đối.


12
public class AndroidScreenActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        String str_ScreenSize = "The Android Screen is: "
                                   + dm.widthPixels
                                   + " x "
                                   + dm.heightPixels;

        TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize);
        mScreenSize.setText(str_ScreenSize);
    }
}

11

Để lấy kích thước màn hình, hãy sử dụng số liệu hiển thị

DisplayMetrics displayMetrics = new DisplayMetrics();
if (context != null) 
      WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
      Display defaultDisplay = windowManager.getDefaultDisplay();
      defaultDisplay.getRealMetrics(displayMetrics);
    }

Lấy chiều cao và chiều rộng tính bằng pixel

int width  =displayMetrics.widthPixels;
int height =displayMetrics.heightPixels;

9

Đây không phải là câu trả lời cho OP, vì anh muốn kích thước hiển thị bằng pixel thực. Tôi muốn kích thước trong "pixel độc lập với thiết bị" và tập hợp các câu trả lời từ đây https://stackoverflow.com/a/17880012/253938 và tại đây https://stackoverflow.com/a/6656774/253938 Tôi đã đưa ra Với cái này:

    DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
    int dpHeight = (int)(displayMetrics.heightPixels / displayMetrics.density + 0.5);
    int dpWidth = (int)(displayMetrics.widthPixels / displayMetrics.density + 0.5);

9

Bạn có thể lấy kích thước chiều cao bằng cách sử dụng:

getResources().getDisplayMetrics().heightPixels;

và kích thước chiều rộng bằng cách sử dụng

getResources().getDisplayMetrics().widthPixels; 

8

Có một cách không được chấp nhận để thực hiện việc này bằng DisplayMetrics (API 1), đó là tránh sự lộn xộn của thử / bắt:

 // initialize the DisplayMetrics object
 DisplayMetrics deviceDisplayMetrics = new DisplayMetrics();

 // populate the DisplayMetrics object with the display characteristics
 getWindowManager().getDefaultDisplay().getMetrics(deviceDisplayMetrics);

 // get the width and height
 screenWidth = deviceDisplayMetrics.widthPixels;
 screenHeight = deviceDisplayMetrics.heightPixels;

8

Tôi sẽ bọc mã getSize như thế này:

@SuppressLint("NewApi")
public static Point getScreenSize(Activity a) {
    Point size = new Point();
    Display d = a.getWindowManager().getDefaultDisplay();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        d.getSize(size);
    } else {
        size.x = d.getWidth();
        size.y = d.getHeight();
    }
    return size;
}

Sự cố này xảy ra trên trình giả lập chạy Android 4.0 (API 14).
18 giờ 31 phút

6

Đối với những người đang tìm kiếm kích thước màn hình có thể sử dụng mà không có Thanh trạng tháiThanh hành động (cũng nhờ câu trả lời của Swapnil):

DisplayMetrics dm = getResources().getDisplayMetrics();
float screen_w = dm.widthPixels;
float screen_h = dm.heightPixels;

int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
    screen_h -= getResources().getDimensionPixelSize(resId);
}

TypedValue typedValue = new TypedValue();
if(getTheme().resolveAttribute(android.R.attr.actionBarSize, typedValue, true)){
    screen_h -= getResources().getDimensionPixelSize(typedValue.resourceId);
}

6

Đầu tiên tải tệp XML và sau đó viết mã này:

setContentView(R.layout.main);      
Display display = getWindowManager().getDefaultDisplay();
final int width = (display.getWidth());
final int height = (display.getHeight());

Hiển thị chiều rộng và chiều cao theo độ phân giải màn hình của bạn.


6

Thực hiện theo các phương pháp dưới đây:

public static int getWidthScreen(Context context) {
    return getDisplayMetrics(context).widthPixels;
}

public static int getHeightScreen(Context context) {
    return getDisplayMetrics(context).heightPixels;
}

private static DisplayMetrics getDisplayMetrics(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics;
}

6

Kotlin

fun getScreenHeight(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.heightPixels
}

fun getScreenWidth(activity: Activity): Int {
    val metrics = DisplayMetrics()
    activity.windowManager.defaultDisplay.getMetrics(metrics)
    return metrics.widthPixels
}

5

Đôi khi bạn cần biết kích thước chính xác của không gian có sẵn cho bố cục khi trong onCreate của một hoạt động. Sau một số suy nghĩ, tôi đã làm việc theo cách này.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startActivityForResult(new Intent(this, Measure.class), 1);
        // Return without setting the layout, that will be done in onActivityResult.
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -1);
        // Width is now set to the precise available width, and a layout can now be created.            ...
    }
}

public final class Measure extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
       // Create a LinearLayout with a MeasureFrameLayout in it.
        // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
        LinearLayout linearLayout = new LinearLayout(this);
        LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
        MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
        measureFrameLayout.setLayoutParams(matchParent);
        linearLayout.addView(measureFrameLayout);
        this.addContentView(linearLayout, matchParent);
        // measureFrameLayout will now request this second activity to finish, sending back the width.
    }

    class MeasureFrameLayout extends FrameLayout {
        boolean finished = false;
        public MeasureFrameLayout(Context context) {
            super(context);
        }

        @SuppressLint("DrawAllocation")
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            if (finished) {
                return;
            }
            finished = true;
            // Send the width back as the result.
            Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
            Measure.this.setResult(Activity.RESULT_OK, data);
            // Tell this activity to finish, so the result is passed back.
            Measure.this.finish();
        }
    }
}

Nếu vì lý do nào đó bạn không muốn thêm một hoạt động khác vào bảng kê khai Android, bạn có thể thực hiện theo cách này:

public class MainActivity extends Activity {
    static Activity measuringActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            extras = new Bundle();
        }
        int width = extras.getInt("Width", -2);
        if (width == -2) {
            // First time in, just start another copy of this activity.
            extras.putInt("Width", -1);
            startActivityForResult(new Intent(this, MainActivity.class).putExtras(extras), 1);
            // Return without setting the layout, that will be done in onActivityResult.
            return;
        }
        if (width == -1) {
            // Second time in, here is where the measurement takes place.
            // Create a LinearLayout with a MeasureFrameLayout in it.
            // Just putting a subclass of LinearLayout in works fine, but to future proof things, I do it this way.
            LinearLayout linearLayout = new LinearLayout(measuringActivity = this);
            LinearLayout.LayoutParams matchParent = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            MeasureFrameLayout measureFrameLayout = new MeasureFrameLayout(this);
            measureFrameLayout.setLayoutParams(matchParent);
            linearLayout.addView(measureFrameLayout);
            this.addContentView(linearLayout, matchParent);
            // measureFrameLayout will now request this second activity to finish, sending back the width.
        }
    }

    @Override
    protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        // Probably can never happen, but just in case.
        if (resultCode == RESULT_CANCELED) {
            finish();
            return;
        }
        int width = data.getIntExtra("Width", -3);
        // Width is now set to the precise available width, and a layout can now be created. 
        ...
    }

class MeasureFrameLayout extends FrameLayout {
    boolean finished = false;
    public MeasureFrameLayout(Context context) {
        super(context);
    }

    @SuppressLint("DrawAllocation")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (finished) {
            return;
        }
        finished = true;
        // Send the width back as the result.
        Intent data = new Intent().putExtra("Width", MeasureSpec.getSize(widthMeasureSpec));
        MainActivity.measuringActivity.setResult(Activity.RESULT_OK, data);
        // Tell the (second) activity to finish.
        MainActivity.measuringActivity.finish();
    }
}    

Rõ ràng, bạn cũng có thể vượt qua chiều cao trong bó quá.
Steve Waring

5

Nếu bạn không muốn chi phí chung của WindowManager, Points hoặc Display, bạn có thể lấy các thuộc tính chiều cao và chiều rộng của mục View trên cùng trong XML của mình, miễn là chiều cao và chiều rộng của nó được đặt thành match_parent. (Điều này đúng miễn là bố cục của bạn chiếm toàn bộ màn hình.)

Ví dụ: nếu XML của bạn bắt đầu bằng thứ gì đó như thế này:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/entireLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

Sau đó findViewById(R.id.entireLayout).getWidth()sẽ trả về chiều rộng của màn hình và findViewById(R.id.entireLayout).getHeight()sẽ trả về chiều cao của màn hình.

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.