2012-05-18 124 views
14

嘿,我需要在我的應用程序中獲得屏幕的寬度。該應用程序將運行在2.1及更高版本上。我已經將它設置爲如下所示。該方法已被棄用,我應該proabably使用getSize或其他方式。但問題是:這會在3.0+和4.0+等Android版本上運行,還是會導致應用程序崩潰。我之前在一個線程中使用了一個不推薦使用的方法,它使應用程序在冰淇淋設備上崩潰。下面的方法會工作嗎?Android獲取屏幕尺寸已棄用?

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

編輯:

我已經試過的getSize,但我不得到它的工作:

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

回答

12

我不知道這些棄用的方法是否可以在Android 3和4上工作。最好告訴的方法是在模擬器上測試。

但是,這裏最安全的方法最大兼容性將嘗試一種方法使用反射,並回落到另一個。本質上,你可以製作你自己的版本getSize(),它不會失敗。我不能對此進行測試ATM,但它可能是這樣的:

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

那當然只是像

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

你能解釋一下新的Class [] {pointClass}的含義嗎? – opc0de

+0

爲了通過反射來獲得一個方法,你必須傳入一個參數類的數組。如果方法過載,則必須指定參數。查看['getMethod()']的文檔(https://developer.android.com/reference/java/lang/Class.html)。所以我們爲'Point'類創建了一個數組,因爲'getSize()'只有這個參數。這有幫助嗎? –

+0

謝謝我對java世界很新穎 – opc0de

0

有什麼不對顯示器的新功能,getSize()?將Point對象轉換爲所需的寬度和高度值非常簡單。

+2

心不是所述的getSize()方法從僅API繳費拉特13和向上還是我誤? – Ukjent

23

稱它爲我不知道,但是這可能工作:

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()現已被棄用... –

3

我已經擴展了Steve的有用代碼,以便Eclipse不會給出任何警告或錯誤,並且我還稍微重構了它。由於API級別從API級別1開始出現,所以我沒有看到通過反射創建它的很多好處。

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