8

我试图弄清楚如何判断状态栏的位置(顶部或底部)。我试图检查HierarchyViewer但没有看到状态栏视图。

我真正需要弄清楚的是,在给定上下文的情况下,一种返回 a 的方法boolean(如果 bar 在顶部,则为 true,如果不是,则为 false - 就像大多数平板电脑上没有的一样)。我写了一个简单的解决方案来尝试找出状态栏是在顶部还是底部,但它似乎没有帮助:

private boolean isStatusBarAtTop(){
    if (!(getContext() instanceof Activity)) {
        return !getContext().getResources().getBoolean(R.bool.isTablet);
    }

    Window window =  ((Activity) getContext()).getWindow();

    if(window == null) {
        return !getContext().getResources().getBoolean(R.bool.isTablet);
    }

    Activity activity = (Activity)getContext();
    Rect rect = new Rect();

    window.getDecorView().getWindowVisibleDisplayFrame(rect);
    View ourView = window.findViewById(Window.ID_ANDROID_CONTENT);

    Log.d("Menu","Window Top: "+ ourView.getTop() + ", "+ourView.getBottom()+ ", "+ourView.getLeft()+", "+ourView.getRight());
    Log.d("Menu","Decor View Dimensions"+rect.flattenToString());

    return  ourView.getTop() != 0;
}

由于某种原因,我得到以下输出(在 Nexus 7 平板电脑上运行):

D/Menu(1007): Window Top: 0, 0, 0, 0
D/Menu(1007): Decor View Dimensions0 0 800 1216

我在想什么/做错了什么?

4

3 回答 3

5

这是唯一对我有用的方法。以下方法返回顶部状态栏高度。因此,如果相应的返回值等于 0,则窗口顶部没有状态栏。

public static int getTopStatusBarHeight(Activity activity) {
    Rect rect = new Rect();

    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

    return rect.top;
}
于 2014-05-03T16:05:38.560 回答
1

真的没有办法告诉状态栏的方向/位置。解释它的最好方法是确保你的观点总是解释它。

@Override
protected boolean fitSystemWindows(Rect insets) {
    RelativeLayout.LayoutParams params = ((RelativeLayout.LayoutParams)this.getLayoutParams());
    int bottom = params.bottomMargin;
    int left = params.leftMargin;
    int right = params.rightMargin;
    params.setMargins(left, insets.top, right, bottom);
    return super.fitSystemWindows(insets);
}

此方法背后的方法(您在 ViewGroup 中覆盖)是inset从框架接收一个矩形,然后将这些插图添加到您的视图填充中。

于 2012-09-12T23:25:47.400 回答
1

我刚刚找到了另一种找出状态栏位置的方法。逻辑很简单,我们有两个步骤来实现这一点,第一个是,

 int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop();

如果状态栏位于顶部,则运行此代码将为您提供(标题栏+状态栏)高度,否则将返回 0。因此我们可以假设输出为 0,状态栏位于底部,否则状态栏位于顶部。

现在状态栏在底部或顶部,这不是问题,我们可以获得这样的高度,

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

我希望这会对某人有所帮助....

于 2013-07-15T09:22:53.150 回答