2012-05-18 29 views
14

Hey Tôi cần có chiều rộng của màn hình trong ứng dụng của mình. Ứng dụng sẽ chạy từ 2.1 trở lên. Tôi đã thiết lập nó như dưới đây. Phương pháp này không được dùng nữa và tôi nên sử dụng getSize hoặc một cách khác. Nhưng câu hỏi đặt ra là: Điều này có hoạt động trên các phiên bản Android như 3.0+ và 4.0+ hay nó sẽ làm cho ứng dụng gặp sự cố. Tôi đã sử dụng một phương pháp không được chấp nhận trong một chủ đề trước đó và nó làm cho các ứng dụng sụp đổ trên các thiết bị kem. Phương pháp bên dưới có hoạt động không?Android có được kích thước màn hình không được chấp nhận?

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

EDIT:

Tôi đã thử các getSize nhưng tôi không nhận được nó để làm việc:

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

Trả lời

12

Tôi không biết liệu các phương pháp không dùng nữa này có hoạt động trên Android 3 và 4. Cách tốt nhất để nói là thử nghiệm trên trình giả lập.

Nhưng, phương pháp an toàn nhất ở đây để có khả năng tương thích tối đa sẽ là thử một phương pháp bằng cách sử dụng phản chiếu và quay lại phương pháp kia. Về cơ bản, bạn có thể tạo phiên bản getSize() của riêng bạn mà không thể thất bại. Tôi không thể kiểm tra atm này, nhưng nó có thể trông như thế này:

void overrideGetSize(Display display, Point outSize) { 
    try { 
     // test for new method to trigger exception 
     Class pointClass = Class.forName("android.graphics.Point"); 
     Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass }); 

     // no exception, so new method is available, just use it 
     newGetSize.invoke(display, outSize); 
    } catch(NoSuchMethodException ex) { 
     // new method is not available, use the old ones 
     outSize.x = display.getWidth(); 
     outSize.y = display.getHeight(); 
    } 
} 

Sau đó, tất nhiên chỉ gọi nó với cái gì đó như

Display display = getWindowManager().getDefaultDisplay(); 
Point size = new Point(); 
overrideGetSize(display, size); 
+0

bạn có thể giải thích Class [] {pointClass} mới có nghĩa là gì không? – opc0de

+0

Để có được một phương thức thông qua sự phản chiếu, bạn phải truyền vào một mảng các lớp tham số của nó. Bạn phải chỉ định các tham số trong trường hợp phương thức bị quá tải. Xem tài liệu cho ['getMethod()'] (https://developer.android.com/reference/java/lang/Class.html). Vì vậy, chúng tôi đang tạo một mảng chỉ là một phần tử cho lớp 'Point', vì' getSize() 'chỉ lấy một tham số đó. cái đó có giúp ích không? –

+0

cảm ơn tôi khá mới với thế giới java – opc0de

0

Điều gì là sai với chức năng mới Display, getSize()? Thật dễ dàng để biến đối tượng Point thành các giá trị chiều rộng và chiều cao mà bạn cần.

+2

Isnt các getSize() phương pháp duy nhất avaiable từ api lvl 13 trở lên hay tôi nhầm? – Ukjent

23

Tôi không chắc chắn nhưng điều này có thể làm việc:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) { 
    Display display = getWindowManager().getDefaultDisplay(); 
    int width = display.getWidth(); 
    int height = display.getHeight(); 
} else { 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int width = size.x; 
    int height = size.y; 
} 
+0

getHeight() hiện không còn được dùng nữa ... –

3

Tôi đã mở rộng mã hữu ích của Steve để Eclipse không đưa ra bất kỳ cảnh báo hoặc lỗi nào, và tôi cũng đã tái cơ cấu nó một chút. Vì lớp Point đã có mặt kể từ khi API cấp 1, tôi không thấy nhiều lợi ích trong việc tạo ra nó thông qua sự phản chiếu.

final static String mTAG = "MYTAG"; 

    // Cope with deprecated getWidth() and getHeight() methods 
    Point getSize(Display xiDisplay) 
    { 
    Point outSize = new Point(); 
    boolean sizeFound = false; 

    try 
    { 
     // Test if the new getSize() method is available 
     Method newGetSize = 
     Display.class.getMethod("getSize", new Class[] { Point.class }); 

     // No exception, so the new method is available 
     Log.d(mTAG, "Use getSize to find screen size"); 
     newGetSize.invoke(xiDisplay, outSize); 
     sizeFound = true; 
     Log.d(mTAG, "Screen size is " + outSize.x + " x " + outSize.y); 
    } 
    catch (NoSuchMethodException ex) 
    { 
     // This is the failure I expect when the deprecated APIs are not available 
     Log.d(mTAG, "getSize not available - NoSuchMethodException"); 
    } 
    catch (InvocationTargetException e) 
    { 
     Log.w(mTAG, "getSize not available - InvocationTargetException"); 
    } 
    catch (IllegalArgumentException e) 
    { 
     Log.w(mTAG, "getSize not available - IllegalArgumentException"); 
    } 
    catch (IllegalAccessException e) 
    { 
     Log.w(mTAG, "getSize not available - IllegalAccessException"); 
    } 

    if (!sizeFound) 
    { 
     Log.i(mTAG, "Used deprecated methods as getSize not available"); 
     outSize = new Point(xiDisplay.getWidth(), xiDisplay.getHeight()); 
    } 

    return outSize; 
    } 
Các vấn đề liên quan