2011-12-31 113 views
8

有没有一种方法可以确定没有硬菜单按钮的设备的菜单栏的尺寸(宽度)? (如拱门设备)。软按钮栏的尺寸

我需要知道屏幕的有效尺寸...

回答

0

开始的Andorid 3.2,系统状态栏的高度不包括在DisplayMetrics的身高,你必须使用无证的API(Display.getRawWidth()和Display.getRawHeight())来获取物理屏幕的宽度或高度。

Method mGetRawW = Display.class.getMethod("getRawWidth"); 
Method mGetRawH = Display.class.getMethod("getRawHeight"); 

int nW = (Integer)mGetRawW.invoke(dp); 
int nH = (Integer)mGetRawH.invoke(dp); 

更新:对于API 13-16,你必须使用上面的代码来获得真正的宽度/高度。对于API 17+,您现在可以使用新的公共API,Display.getRealSize()

+0

什么是dp in(Integer)mGetRawW.invoke(dp);它将返回包含软菜单的高度。 – Herry 2015-08-12 14:11:32

+0

它给了我一个NoSuchMethodException异常。 – DevAndroid 2015-11-19 09:09:39

+0

什么是dp?也找不到这两种方法(NoSuchMethod异常) – Alqueraf 2016-04-05 16:00:22

12

此方法对于在Android KitKat(4.4)中设置布局填充非常有用。使用此功能,您可以避免软按钮栏与布局重叠。

getRealMetrics方法仅适用于API 17和+,但我只使用以下的方法对我的设备上写API 19+

@SuppressLint("NewApi") 
private int getSoftbuttonsbarHeight() { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

测试后的Nexus 5 &的Nexus 7 2013

+0

看来,错误的结果被返回为横向屏幕模式 – Sergii 2015-02-01 22:53:12

+0

我没有任何问题与横向模式。您的方法是否在轮换更改时再次调用? – chteuchteu 2015-02-02 12:36:38

+2

不,我的意思是在某些情况下,你需要检查宽度的差异,但不是高度。当软键位于风景模式旋转屏幕的右侧时? – Sergii 2015-02-02 21:17:22

2

对于遇到此问题的人来说,这是一个非常晚的答案。获取大量可用空间以抵消任何软键/导航栏甚至状态栏的简单方法是使用Apps DecorView中的getWindowVisibleDisplayFrame(Rect)。这将加载一个Rect对象,其中包含实际可用的显示尺寸。

由于您无法直接获取对Activiy的DecorView的引用,因此您需要先使用访问器方法getWindow()获取Activity的窗口。这将返回包含Activity和其他屏幕元素的窗口对象。要获取包含活动的decorView以及屏幕装饰,即状态栏,导航栏/软按钮栏,调用访问器方法getDecorView()。一旦你有一个DecorView调用getWindowVisibleDisplayFrame(Rect)的引用,并且你将有一个加载的Rect对象。