web-dev-qa-db-ja.com

ステータスバーの高さを確実に取得して、キットカットの半透明ナビゲーションの問題を解決します

新しいAndroid 4.4半透明ナビゲーションバーを試しています。FLAG_TRANSLUCENT_NAVIGATIONフラグを使用してナビゲーションバーを半透明に設定したいと思います。ナビゲーションバー(戻る、ホームボタンなど)半透明にする-画面の上部にあるステータスバーを通常のように、つまり半透明にしないようにします。

これを達成するために使用しているコードは次のとおりです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat) {
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

私が抱えている問題はAndroidはアクティビティがフルスクリーンであると考え、ナビゲーションバーの後ろにレイアウトを配置する(これは正しい)です。残念ながら、ステータスバーの後ろにもレイアウトを配置します(問題)。

これのハック修正は、レイアウトの親ビューの上部にパディングを適用することですが、これを行うにはステータスバーの高さを決定する必要があります。

誰も私がステータスバーの高さを取得する方法を提案してもらえますか、それは思っていたほど簡単ではありません、または代わりに適切な解決策を提案してください。

ありがとう

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

OnCreateメソッドで上記のコードを使用します。それをcontextWrapperクラスに入れます。 http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-Android/

56
user2511882

API 21以来、ステータスバーとナビゲーションバーの高さが半透明の場合にインセットを取得する公式の方法があります

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() {
        @Override
        public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
            final int statusBar = insets.getSystemWindowInsetTop();
            final int navigationBar = insets.getSystemWindowInsetBottom();
            return insets;
        }
    });
22

下部のナビゲーションバーの高さは48dp(ポートレートモードとランドスケープモードの両方)で、バーを垂直に配置すると42dpです。

お役に立てれば。

3
Aritra Roy

受け入れられた答えは、常にステータスバーの高さを返します(そしていくらかハックな方法で)。ただし、一部のアクティビティは実際にはフルスクリーンである場合があり、この方法ではそれらを区別しません。

このメソッドは、現在のアクティビティに関連するステータスバーの高さを見つけるのに最適です(Activityクラスに配置し、レイアウトが完了したら使用します)。

public int getStatusBarHeight() {
    Rect displayRect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect);
    return displayRect.top;
}

画面の下部または潜在的に画面の両側に他の「ウィンドウ装飾」がある場合は、直接displayRectを使用することもできます。

3
Mete

このスクリプトを使用してステータスバーの高さを取得することをお勧めします

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = 
    window.findViewById(Window.ID_Android_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

   Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(古いメソッド)アクティビティのonCreate()メソッドでステータスバーの高さを取得するには、次のメソッドを使用します。

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