快速解决Android7.0下沉浸式状态栏变灰的问题 在 Android 应用开发中,实现沉浸式状态栏是非常重要的。然而,在 Android 7.0 及其以上的系统中,沉浸式状态栏可能会变灰。今天,我们将讨论快速解决 Android 7.0 下沉浸式状态栏变灰的问题。 1. 问题背景 现在,大多数应用都会实现沉浸式状态栏,这是应用的标配。如果您的应用没有实现沉浸式状态栏,那么就会被吐槽很多,例如“美工有审美观么”、“程序猿这么菜,沉浸式都不会?”等等。 2. 问题描述 那么,沉浸式状态栏的问题是什么呢?不知道大家有没有遇到过,应用在 Android 7.0 系统以下的手机上运行,沉浸式状态栏是正常的,但是在 7.0 以上的手机上运行就感觉没有沉浸式了,是分层的。无论怎么修改状态栏背景色都没用。 3. 解决方法 解决方法先普及下知识:DecorView 是整个 Window 界面的最顶层 View,它只有一个子元素为 LinearLayout。代表整个 Window 界面,包含通知栏、标题栏、内容显示栏三块区域。DecorView 这个大家应该很熟悉,通过 getWindow().getDecorView() 就可以得到此对象,在 6.0 以上,我们可以通过以下方式设置状态栏字体变黑: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 那么可以猜想状态栏蒙灰肯定跟这个 view有关。接下来我们就去看 DecorView 的源码,对比 Android 6.0 和 7.0 有什么不同。你会发现 Android 7.0 以下,DecorView 是 PhoneWindow 的内部类,而在 7.0 以上,是一个单独的类,并且有新的属性和方法。 新的属性如:mSemiTransparentStatusBarColor,看字面意思应该就是我们要找的,我们对它进行跟踪,与它相关的代码如下: DecorView(Context context, int featureId, PhoneWindow window,WindowManager.LayoutParams params) { super(context); ......//省略无关代码 mForceWindowDrawsStatusBarBackground = context.getResources().getBoolean( R.bool.config_forceWindowDrawsStatusBarBackground) && context.getApplicationInfo().targetSdkVersion >= N; //设置默认的值,灰色 mSemiTransparentStatusBarColor = context.getResources().getColor( R.color.system_bar_background_semi_transparent, null /* theme */); ......//省略无关代码 } private int calculateStatusBarColor() { int flags = mWindow.getAttributes().flags; return (flags & FLAG_TRANSLUCENT_STATUS) != 0 ? mSemiTransparentStatusBarColor : (flags & FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0 ? mWindow.mStatusBarColor : Color.BLACK; } calculateStatusBarColor 这个方法就是计算得到状态栏的颜色值,其中 FLAG_TRANSLUCENT_STATUS 是透明标识,如果 flags 与 FLAG_TRANSLUCENT_STATUS 相与不等于 0 的话就选择默认灰色值 mSemiTransparentStatusBarColor。 这个 calculateStatusBarColor 方法在 updateColorViews 方法中调用,而 updateColorViews 方法又在 onWindowDragResizeStart、onWindowDragResizeEnd 等方法调用(相关代码就不再帖了,请自行查看源码),看到这里就知道为啥怎么修改状态栏颜色也没用的原因了,这个背景色是动态算的。 因此,我们可以通过设置 DecorView 的系统 UI 可见性来解决这个问题: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 通过这种方式,我们可以解决 Android 7.0 下沉浸式状态栏变灰的问题。
- 粉丝: 5
- 资源: 915
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助