【发布时间】:2011-12-31 16:13:45
【问题描述】:
有没有办法确定没有硬菜单按钮的设备菜单栏的尺寸(宽度)? (如 archos 设备)。
我需要知道屏幕的可用尺寸...
【问题讨论】:
标签: android
有没有办法确定没有硬菜单按钮的设备菜单栏的尺寸(宽度)? (如 archos 设备)。
我需要知道屏幕的可用尺寸...
【问题讨论】:
标签: android
此方法对于在 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) {
return 0;
}
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
return realHeight > usableHeight ? realHeight - usableHeight : 0;
}
在 Nexus 5 和 Nexus 7 2013 上测试。
【讨论】:
一个非常晚的答案,但对于遇到此问题的任何人。获得抵消任何软键/导航栏甚至状态栏的可用空间量的简单方法是使用 Apps DecorView 中的 getWindowVisibleDisplayFrame(Rect)。这将加载一个具有实际可用显示尺寸的 Rect 对象。
由于不能直接获取到 Activiy 的 DecorView 的引用,所以需要首先使用访问器方法 getWindow() 获取 Activity 的窗口。这将返回包含 Activity 和其他屏幕元素的窗口对象。要获取包含 Activity 以及屏幕装饰(即状态栏、导航栏/软按钮栏)的 decorView,请调用访问器方法 getDecorView()。一旦你引用了 DecorView 调用 getWindowVisibleDisplayFrame(Rect) ,你就会有一个加载的 Rect 对象。
【讨论】:
从 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()
【讨论】:
对我来说,在 android note 10 中,我需要按尺寸获取导航栏高度:
fun getSoftNavigationBarSize(resources: Resources): Int {
var result = 0
val resourceId: Int = resources.getIdentifier("navigation_bar_height", "dimen", "android")
if (resourceId > 0) {
result = resources.getDimensionPixelSize(resourceId)
}
return result
}
【讨论】: