如何获得导航栏的方向

时间:2014-03-18 10:15:30

标签: android android-view android-resources

我需要知道导航栏是水平的(位于屏幕底部)还是垂直的(位于屏幕右侧)。

现在我正在使用此代码获取高度,但即使在风景手机(具有垂直导航栏)上也会返回48dp:

public  int getNavigationBarHeight() {
    int resourceId = getResources().getIdentifier("navigation_bar_height_landscape", "dimen", "android");
    if (resourceId > 0) {
        return getResources().getDimensionPixelSize(resourceId);
    }
    return 0;
}

是否有API或策略来确定方向?

2 个答案:

答案 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;
}

希望这个帮助