可靠地获取状态栏的高度以解决KitKat半透明导航问题

Mil*_*ilo 26 android view android-layout android-4.4-kitkat

我正在尝试新的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);
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是Android现在认为Activity是全屏的并且将布局放在导航栏后面(这是正确的),不幸的是它也将布局放在状态栏后面(一个问题).

一个hacky修复此问题的方法是将填充应用于布局父视图的顶部,但是我需要确定状态栏的高度来执行此操作.

任何人都可以建议我如何获得状态栏高度,它不像我想象的那样微不足道,或者建议一个正确的解决方案.

谢谢

use*_*882 56

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

在onCreate方法中使用上面的代码.把它放在contextWrapper类中. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

  • 遗憾的是没有一种可靠的方法来获取每个设备上状态栏的高度。也就是说,它现在必须要做。 (2认同)

Jac*_*cki 23

由于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;
        }
    });
Run Code Online (Sandbox Code Playgroud)