android沉浸式状态栏




状态栏的高度? (7)

有没有办法获得状态栏+标题栏的高度? 检查开发论坛显示相同的问题,但没有解决方案(我可以找到)。

我知道我们可以在初始布局通过后得到它,但我希望在我的活动的onCreate()中得到它。

谢谢


Jorgesys发布的解决方案非常好,但它在onCreate()方法中不起作用。 我想这是因为在onCreate()之后创建了状态栏和标题栏。

解决方案很简单 - 您应该将代码放在runnable中并使用root.post((Runnable action) );在onCreate()之后执行它root.post((Runnable action) );

所以整个解决方案:

root = (ViewGroup)findViewById(R.id.root);
root.post(new Runnable() { 
        public void run(){
            Rect rectgle= new Rect();
            Window window= getWindow();
            window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
            int StatusBarHeight= rectgle.top;
            int contentViewTop= 
                 window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
            int TitleBarHeight= contentViewTop - StatusBarHeight;

            Log.i("***  jakkubu :: ", "StatusBar Height= " + StatusBarHeight +
               " , TitleBar Height = " + TitleBarHeight);
        }
});

我在here找到它


从API 23开始,有一个更好的解决方案来获取状态栏高度。 API 23添加了一个WindowInsets功能,因此您可以使用此代码来获取系统插入的大小,在本例中为顶部。

public int getStatusBarHeight() {
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        return binding.mainContent.getRootWindowInsets().getStableInsetTop();
    }
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if(resourceId != 0) {
        return getResources().getDimensionPixelSize(resourceId);
    }
    return 0;
}

请注意, getRootWindowInsets()将返回null,直到View已附加到Window,因此它不能直接在onCreate()但您可以为窗口附加添加一个侦听器并在那里执行 - 这里我添加了状态栏插入我的工具栏大小,我隐藏和显示,以及状态栏。 当它显示时,我想要状态栏在它的顶部,所以我将状态栏高度添加到工具栏的顶部填充。

    binding.mainContent.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
        @Override
        public void onViewAttachedToWindow(View view) {
            binding.toolbar.setPadding(binding.toolbar.getPaddingLeft(),
                binding.toolbar.getPaddingTop() + getStatusBarHeight(),
                binding.toolbar.getPaddingRight(), binding.toolbar.getPaddingBottom());
            binding.mainContent.removeOnAttachStateChangeListener(this);
        }

        @Override
        public void onViewDetachedFromWindow(View view) {

        }
    });

对于像我这样想要在XML布局中使用它的人:

<...
  android:layout_marginTop="@*android:dimen/status_bar_height"
  ... />

不要被Android Studio混淆(2.2预览3 - 在写作的那一刻)不支持这个概念。 运行时呢。 我从Google的源代码中获取了它。


您还可以使用here描述的方式获取android的dimens.xml文件中找到的状态栏的维度。

这可以获得状态栏的高度,而无需等待绘图。

引用博客文章中的代码:

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

您需要将此方法放在ContextWrapper类中。


我认为更好的计算方法是获得全屏高度减去我们的主要布局

phoneBarsHeight = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getHeight() 
    - mainView.getHeight();

你可以把它放在onGlobalLayout() 。 这也适用于平板电脑,我在Theme.NoTitleBar上试过它,但它必须始终有效。

也许你甚至可以通过将mainView.getHeight()更改为mainView.getHeight()来增强它并在onCreate()使用它。


获得状态栏高度的支持方法是从API 21+开始使用WindowInsets类:

customView.setOnApplyWindowInsetsListener((view, insets) -> {
    // Handle insets
    return insets.consumeSystemWindowInsets();
});

或支持库的WindowInsetsCompat

ViewCompat.setOnApplyWindowInsetsListener(customView, (view, insets) -> {
    // Handle insets
    return insets.consumeSystemWindowInsets();
});

您还可以在视图中覆盖onApplyWindowInsets方法:

public class CustomView extends View {
    @Override
    public WindowInsets onApplyWindowInsets(final WindowInsets insets) {
        final int statusBarHeight = insets.getStableInsetTop();
        return insets.consumeStableInsets();
    }
}

有关详细信息,我建议您查看Chris Banes的演讲 - 成为主窗口钳工here提供幻灯片)。


Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop= 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;

   Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 

获取Activity的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;
} 




android