Android 全面屏显示\沉浸式状态栏

前言:

之前做项目为了达到全面屏显示,设置了一个theme主题样式,如下:

	<!-- 应用全屏样式 -->
    <style name="AppFullWindowTheme" parent="AppTheme">
        <item name="android:windowFullscreen">true</item>
    </style>

但是在部分手机上会出现一个坑爹的现象:虽然状态栏隐藏了,但是原状态栏位置上会被黑条占领。(没错,就是在万恶的小米手机上出现了…)

解决方案:

方案1:在代码中设置

WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
            lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
            activity.getWindow().setAttributes(lp);
            
            View decorView = activity.getWindow().getDecorView();
            int systemUiVisibility = decorView.getSystemUiVisibility();
            int flags =View.SYSTEM_UI_FLAG_HIDE_NAVIGATION//隐藏导航栏
                    | View.SYSTEM_UI_FLAG_FULLSCREEN;//隐藏状态栏
            systemUiVisibility |= flags;
            
            activity.getWindow().getDecorView().setSystemUiVisibility(systemUiVisibility);

方案2:在xml中设置theme

<style name="AppFullTheme" parent="AppTheme">
        <item name="android:windowTranslucentNavigation">true</item>
        <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
        <item name="android:windowFullscreen">true</item>
 </style>

注解1: Android P版本为我们提供了解决方法,我们可以通过对Window设置layoutInDisplayCutoutMode来达到我们的目的,先来看一下layoutInDisplayCutoutMode的几种属性:

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:默认情况下,全屏窗口不会使用到刘海区域,非全屏窗口可正常使用刘海区域
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:窗口不允许和刘海屏重叠
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
:该窗口始终允许延伸到屏幕短边上的DisplayCutout区域。

注解2: 了解一下几个设置沉浸式状态栏的基础属性:

1.View.SYSTEM_UI_FLAG_LOW_PROFILE:低调模式, 会隐藏不重要的状态栏图标;
2.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏导航栏;
3.View.SYSTEM_UI_FLAG_FULLSCREEN:状态栏隐藏(高度不变);
4.View.SYSTEM_UI_FLAG_LAYOUT_STABLE:保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout;
5.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:视图延伸至导航栏区域,导航栏覆盖在视图之上(在style中设置windowTranslucentNavigation);
6.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN :视图延伸至状态栏区域,状态栏覆盖在视图之上(在style中设置windowTranslucentStatus);
7.View.SYSTEM_UI_FLAG_IMMERSIVE:配合2或3同时使用,假设同时设置了2和7,状态栏隐藏,此时在状态栏顶部下滑,系统清除2设置,重新唤出状态栏,导航栏同理,滑动方向为由下至上;
8.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:作用与7相似,但是设置并未被清楚,所以状态栏与导航栏在被唤出3s后或再次点击时,再次隐藏。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android 沉浸状态栏指的是在应用中隐藏系统状态栏,使应用的界面能够占据整个幕空间,提供更加沉浸的使用体验。在 Android 4.4 KitKat(API 级别 19)及以上版本中,引入了沉浸状态栏的支持。 要实现沉浸状态栏,可以按照以下步骤进行操作: 1. 在 AndroidManifest.xml 文件中,为对应的 Activity 设置 `android:theme` 属性为 `@style/Theme.AppCompat.NoActionBar` 或者其他无 ActionBar 特性的主题。 2. 在对应 Activity 的 `onCreate` 方法中添加以下代码来隐藏系统状态栏: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } ``` 3. 如果你想要在状态栏下方留出一定的空间,可以设置 paddingTop,例如: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int statusBarHeight = getStatusBarHeight(); View view = findViewById(R.id.your_view_id); view.setPadding(0, statusBarHeight, 0, 0); } private int getStatusBarHeight() { int result = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } ``` 这样就可以实现 Android 沉浸状态栏的效果。需要注意的是,沉浸状态栏可能会导致一些 UI 布局的问题,需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值