8

ステータスバーの位置(上または下)をどのように見分けることができるかを理解しようとしています。確認しようとしましHierarchyViewerたが、ステータス バー ビューが表示されませんでした。

本当に私が理解する必要があるのは、コンテキストが与えられた場合に (バーが一番上にある場合は true、そうでない場合は false -ほとんどのタブレットbooleanにはないように)を返す方法です。ステータスバーが上部または下部にあることを確認するための簡単な解決策を書きましたが、役に立たないようです:

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

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、フレームワークから rect を受け取り、それらのインセットをビューのパディングに追加することです。

于 2012-09-12T23:25:47.400 に答える