首页

源码搜藏网

首页 > 安卓源码 > 技术博客 >

沉浸式状态栏技术方案及其中的一些坑

创建时间:2016-12-06 22:12  浏览

沉浸式状态栏

沉浸式状态栏是android 4.4开始支持的一个feature,在软件打开的时候通知栏和软件顶部颜色融为一体,这样不仅可以使软件和系统本身更加融为一体,而且让用户注意力更加集中在内容上。

在ios上这是一个很早就支持的功能,但在android上则一直只能看到黑色的状态栏。google mail在抽屉上成功展示了沉浸式状态栏,可见想要把内容显示在状态栏肯定是能做的。

沉浸式状态栏技术方案及其中的一些坑

技术方案

虽然google官方文档和网上那些技术文章中,都轻描淡写地用

[代码]xml代码:

?
1
<item name="android:windowTranslucentStatus">true</item>

 

或者

[代码]java代码:

?
1
2
3
4
5
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = getWindow();
    window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

 

 

但设置后,则会把状态栏当做应用可用区域的一部分,而导致应用标题栏的图标/文字显示到状态栏上,和原有时间等区域重合。而设置android:fitsSystemWindows=”true”则只是把整个window的背景色延展到了状态栏,实则是伪沉浸式。
沉浸式状态栏技术方案及其中的一些坑

所以这里要做的是如何在做好沉浸式的同时不让状态栏本身内容被影响。

大致实现

遇到和解决的一些坑

待完善点

[代码]java代码:

?
01
02
03
04
05
06
07
08
09
10
11
12
public void setStatusBarDarkMode(boolean darkmode, Activity activity) { 
    Class<!--? extends Window--> clazz = activity.getWindow().getClass(); 
    try
        Class<!--?--> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); 
        Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); 
        int darkModeFlag = field.getInt(layoutParams); 
        Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); 
        extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag); 
    } catch (Exception e) { 
        e.printStackTrace(); 
    
}

上一篇:Android Apk 文件反编译和重新打包的过程分析
下一篇:Android实现热修复

相关内容

热门推荐