我需要知道导航栏是水平的(位于屏幕底部)还是垂直的(位于屏幕右侧)。
现在我正在使用此代码获取高度,但即使在风景手机(具有垂直导航栏)上也会返回48dp:
public int getNavigationBarHeight() {
int resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
if (resourceId > 0) {
return getResources().getDimensionPixelSize(resourceId);
}
return 0;
}
是否有API或策略来确定方向?
答案 0 :(得分:1)
通常,您不需要 来了解导航栏是垂直还是水平,因为它会从您调用此代码时收到的测量值中自动扣除:
Rect visibleFrame = new Rect();
mainActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleFrame);
int heightOfDisplayInPixels = visibleFrame.height();
int widthOfDisplayInPixels = visibleFrame.width();
此代码会向应用返回应用实际可用的区域的高度和宽度供其使用。它从相关维度中扣除导航栏和状态栏。
上述代码的唯一问题是,如果用户碰巧打开了软键盘,键盘的高度也将从返回的值中扣除。即使您在运行上述代码之前有关闭键盘的代码,键盘关闭可能需要几分之一秒才会反映在上面的值中。我发现500 msecs的延迟(例如,通过postDelayed())对于我个人使用的每个测试设备来说都足够了。
当然,编码这样的延迟是具有内置竞争条件的kluge。尽管如此,除了这个重要问题之外,上述代码似乎也能正常工作,而且我还没有找到更好的方法来确保您具有在所有(已测试)设备上正确考虑导航栏的准确值。
具体而言,DisplayMetrics返回的值虽然没有上述问题,但在所有设备上都不一致;例如,导航栏是在Nexus 7上扣除的,而不是在Kindle Fire HD 7上(BTW,是横向导航时具有垂直导航栏的设备之一)。
某些边缘情况,您可能想要知道导航栏的实际位置,例如当您想要避免在导航栏附近放置某个常用控件时,以便用户在尝试使用它时不会意外点击Back或Home。但一般来说,这可以避免(例如,通过将该控件与主视图的边缘保持良好的距离)。
答案 1 :(得分:0)
为什么不检查屏幕方向而不是导航栏方向。实际上,导航栏仅在横向上变为垂直,因此请使用:
getResources().getConfiguration().orientation
要获得当前的定位,但有时这种方法并不实用,您可以尝试:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
希望这个帮助