如何获取Android屏幕的可用高度?我需要减去状态栏/菜单栏或屏幕上可能显示的任何其他装饰的高度,并且需要它适用于所有设备。另外,我需要在onCreate函数中知道这一点。我知道之前曾有人问过这个问题,但我已经尝试过他们的解决方案,但没有一个起作用。这是我尝试过的一些方法:
我已经在API 7-17上测试了此代码。不幸的是,在API 13的水平和垂直底部都没有多余的空间,而在API 10、8和7的水平和垂直底部都没有足够的空间。(我尚未测试过时的API):
Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixels; TypedValue tv = new TypedValue(); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) screenHeight -= TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics()); } int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) screenHeight -= getResources().getDimensionPixelSize(resourceId);
这没有考虑状态栏/菜单栏:
Display display = getWindowManager().getDefaultDisplay(); screenWidth = display.getWidth(); screenHeight = display.getHeight();
这也没有:
Point size = new Point(); getWindowManager().getDefaultDisplay().getSize(size); screenWidth = size.x; screenHeight = size.y;
也没有:
Point size = new Point(); getWindowManager().getDefaultDisplay().getRealSize(size); screenWidth = size.x; screenHeight = size.y;
这不起作用:
Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); // since SDK_INT = 1; screenWidth = metrics.widthPixels; screenHeight = metrics.heightPixels; try { // used when 17 > SDK_INT >= 14; includes window decorations (statusbar bar/menu bar) screenWidth = (Integer) Display.class.getMethod("getRawWidth").invoke(display); screenHeight = (Integer) Display.class.getMethod("getRawHeight").invoke(display); } catch (Exception ignored) { // Do nothing } try { // used when SDK_INT >= 17; includes window decorations (statusbar bar/menu bar) Point realSize = new Point(); Display.class.getMethod("getRealSize", Point.class).invoke(display, realSize); screenWidth = realSize.x; screenHeight = realSize.y; } catch (Exception ignored) { // Do nothing }
然后,我使用以下代码从屏幕高度中减去状态栏和菜单栏的高度:
int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) result = getResources().getDimensionPixelSize(resourceId); screenHeight -= result; result = 0; if (screenHeight >= screenWidth) resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); else resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android"); if (resourceId > 0) result = getResources().getDimensionPixelSize(resourceId); screenHeight -= result;
在API 17上,它可以正确计算纵向状态栏和菜单栏的高度,而不能横向计算状态栏和菜单栏的高度。在API 10上,它返回0。我需要它在所有设备上运行,或者在最低API 7下运行。
工作解决方案:
创建两个虚拟视图:
<View android:id="@+id/top" android:layout_height="0dp" android:layout_width="match_parent" android:layout_alignParentTop="true" /> <View android:id="@+id/bottom" android:layout_height="0dp" android:layout_width="match_parent" android:layout_alignParentBottom="true" />
现在,您应该调用getLocationOnScreen(int [])这两个视图以接收它们的位置。此函数返回2个整数的数组。第一个是x,第二个是y。我们只需要y。还要注意,只有在创建所有视图并onCreate退出方法之后,才返回正确的值。
getLocationOnScreen(int [])
onCreate
我在从viewpager调用的常规片段上测试了此代码。
代码在onCreateView我的片段方法中。我仍然必须使用a postDelayed来获取正确的值。
onCreateView
postDelayed
final View top = (View) view.findViewById(R.id.top); final View bottom = (View) view.findViewById(R.id.bottom); new Handler().postDelayed(new Runnable() { @Override public void run() { int topLoc[] = new int[2]; top.getLocationOnScreen(topLoc); int BottomLoc[] = new int[2]; bottom.getLocationOnScreen(BottomLoc); Log.d(Constants.debug, "topY: "+ topLoc[1]+" BottomY:" + BottomLoc[1]); } },4000);
我有一个Nexus 4。
在常规模式下(状态栏和显示的软按钮):
07-05 02:28:23.367 565-565/com.torcellite.xx D/xx: topY: 50 BottomY:1182
在全屏模式下(不显示状态栏或软按钮):
07-05 02:29:17.360 707-707/com.torcellite.xx D/xx: topY: 0 BottomY:1280
您现在要做的就是减去。