2013-01-15 175 views
35
DisplayMetrics metrics = new DisplayMetrics(); 
this.getWindowManager().getDefaultDisplay().getMetrics(metrics); 
screenWidth = metrics.widthPixels; 
screenHeight = metrics.heightPixels; 

我使用這些代碼來獲得高度和屏幕的寬度如何獲得真正的屏幕高度和寬度?

我Nexus7屏幕高度應該是1280

但它返回1205 ...

和我的minSdkVersion是水平8

,所以我不能使用這些方法:

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

現在,我應該如何獲得正確的屏幕尺寸?

編輯:

if (Build.VERSION.SDK_INT >= 11) { 
     Point size = new Point(); 
     try { 
      this.getWindowManager().getDefaultDisplay().getRealSize(size); 
      screenWidth = size.x; 
      screenHeight = size.y; 
     } catch (NoSuchMethodError e) { 
      Log.i("error", "it can't work"); 
     } 

    } else { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     this.getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     screenWidth = metrics.widthPixels; 
     screenHeight = metrics.heightPixels; 
    } 

使用它的工程!

+0

這有幫助嗎? http://stackoverflow.com/questions/1016896/android-how-to-get-screen-dimensions – trojanfoe

+0

不,我不能使用'display.getSize(size);'因爲我的min SDK是level 8 – user1531240

+0

那麼if你閱讀trojanfoe的鏈接中的一些評論,他們建議像這樣:try {display.getSize(size); width = size.x; height = size.y; } catch(NoSuchMethodError e){width = display.getWidth(); height = display.getHeight(); } ....但是,即使你可以使用getSize()方法,我認爲你仍然會得到這個可用屏幕高度的1205分辨率(即減去導航按鈕)。不知道如何獲得導航按鈕的高度,但有興趣和期待。 – ggenglish

回答

32

我認爲這會奏效。訣竅是,你必須使用:

display.getRealSize(size); 

display.getSize(size); 

處理自己的API 8編碼問題做這樣的事情:

try { 
    display.getRealSize(size); 
    height = size.y; 
} catch (NoSuchMethodError e) { 
    height = display.getHeight(); 
} 

只有較新的API的設備將有屏幕導航按鈕,因此需要新的方法,舊設備會拋出一個異常,但不會有屏幕導航,因此舊方法是好的。

如果需要說明:僅僅因爲您的項目的最低API等級爲8並不意味着您必須在該級別進行編譯。我也使用8級作爲最低限度,但我的項目主要是在13級(3.2)編譯,使他們能夠訪問很多新的方法。

+0

非常非常感謝你!!!!!有用!!!! YA !!!!! – user1531240

+2

而不是使用try-catch塊,您可以檢查設備上的api級別。請參閱Build.VERSION和方法Display.getHeight,Display.getSize,display.getRealSize – mehmet6parmak

+3

請記住,此方法不適用於API級別14,15和16,因爲'getRealSize()'方法僅在API級別引入17.以下是找到原始值的解決方法 Saket

40

我寫了一個方法,將盡可能接近API 10到17+。它應該爲API 14+提供真正的寬度和高度,並且它可以滿足所有其他需求。

Display display = context.getWindowManager().getDefaultDisplay(); 
    int realWidth; 
    int realHeight; 

    if (Build.VERSION.SDK_INT >= 17){ 
     //new pleasant way to get real metrics 
     DisplayMetrics realMetrics = new DisplayMetrics(); 
     display.getRealMetrics(realMetrics); 
     realWidth = realMetrics.widthPixels; 
     realHeight = realMetrics.heightPixels; 

    } else if (Build.VERSION.SDK_INT >= 14) { 
     //reflection for this weird in-between time 
     try { 
      Method mGetRawH = Display.class.getMethod("getRawHeight"); 
      Method mGetRawW = Display.class.getMethod("getRawWidth"); 
      realWidth = (Integer) mGetRawW.invoke(display); 
      realHeight = (Integer) mGetRawH.invoke(display); 
     } catch (Exception e) { 
      //this may not be 100% accurate, but it's all we've got 
      realWidth = display.getWidth(); 
      realHeight = display.getHeight(); 
      Log.e("Display Info", "Couldn't use reflection to get the real display metrics."); 
     } 

    } else { 
     //This should be close, as lower API devices should not have window navigation bars 
     realWidth = display.getWidth(); 
     realHeight = display.getHeight(); 
    } 
+0

偉大的帖子..對我非常有幫助..謝謝@CorayThan – AndEngine

+0

可愛的方法。希望我可以多點讚賞。必須是選定的答案。 – Sufian

+1

請注意,上下文必須是一個活動 –

0

你可以找到使用DisplayDisplayMetrics

或者使用實時顯示設備尺寸:

private void findRealSize(Activity activity) 
{ 
    Point size = new Point(); 
    Display display = activity.getWindowManager().getDefaultDisplay(); 

    if (Build.VERSION.SDK_INT >= 17) 
     display.getRealSize(size); 
    else 
     display.getSize(size); 

    int realWidth = size.x; 
    int realHeight = size.y; 

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight); 
} 

使用DisplayMetrics:

private void findRealSize(Activity activity) 
{ 
    DisplayMetrics displayMetrics = new DisplayMetrics(); 

    if (Build.VERSION.SDK_INT >= 17) 
    { 
     activity.getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics); 
    } 
    else 
    { 
     activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
    } 

    int realWidth = displayMetrics.widthPixels; 
    int realHeight = displayMetrics.heightPixels; 

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight); 
} 
相關問題