2013-01-15 136 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); 
} 
相关问题