(推荐)沉浸式状态栏实现,完美适配Android刘海屏,终极兼容

2018-12-14 17:16:51

刘海屏出来有一段时间了,为了适配刘海屏找了不少方案,感觉都比较费劲。 

因为我们项目需求,状态栏是渐变色,所以我采用了全面屏的模式来对标题栏状态栏进行开发; 


总体思路:刘海屏状态栏的高度其实和普通的都是一样,所以只要给全面屏的页面设置一个paddingtop就可以实现,我是写一个公共的头部布局在基类里用,给头布局设置一个paddingtop,paddingtop的值就是状态栏的高度。具体代码如下: 




第一步:设置全屏,设置状态栏透明 



    /*

     * @param activity

     */

    public static void fullScreen(Activity activity) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

                //5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色

                Window window = activity.getWindow();

                View decorView = window.getDecorView();

                //两个 flag 要结合使用,表示让应用的主体内容占用系统状态栏的空间

                int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

                decorView.setSystemUiVisibility(option);

                window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

                window.setStatusBarColor(Color.TRANSPARENT));

            } else {

                Window window = activity.getWindow();

                WindowManager.LayoutParams attributes = window.getAttributes();

                int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;

                int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;

                attributes.flags |= flagTranslucentStatus;

                window.setAttributes(attributes);

            }

        }

    }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25




第二步:添加头布局 


也可以使用跟布局,具体情况看自己的项目


<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".base.MVPBaseActivity">

    <!-- 顶部导航 -->

    <include

        android:id="@+id/includ_title"

        layout="@layout/header_title_layout" />

    <!-- 中间填充部分 -->

    <FrameLayout

        android:id="@+id/fl_body"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:layout_below="@+id/includ_title"

        android:orientation="vertical" />

</RelativeLayout>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18




第三步:给头布局设置布局的paddingtop 


根据SDK号去判断是否设置paddingtop,不支持沉浸式状态栏的机型,直接不进行设置即可。这样既实现了沉浸式状态栏,同时又适配了刘海屏,不需要考虑手机品牌等问题。


/*

 * @param view 需要设置的view,我这里用到的是布局文件中的include_title

 */

public void setBarPadding(View view) {

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {

            view.setPadding(view.getPaddingLeft(),UIUtils.dip2px(8),view.getPaddingRight(), view.getPaddingBottom());

        } else {

            view.setPadding(view.getPaddingLeft(), getStatuBarHeight(), view.getPaddingRight(), view.getPaddingBottom());

        }

    }


  • 2017-04-02 00:42:51

    PHP的pm、pm.max_requests、memory_limit参数优化说明

    pm是来控制php-fpm的工作进程数到底是一次性产生固定不变(static)还是在运行过程中随着需要动态变化(dynamic)。众所周知,工作进程数与服务器性能息息相关,太少则不能及时处理请求,太多则会占用内存过大而拖慢系统。

  • 2017-04-02 00:44:46

    NGINX + PHP-FPM 502 相关事

    NGINX + PHP-FPM 报 502 错误,我想大部分 SA 都遇到过吧。 根据报错的频率,可以分为两种情况,间歇性的502和连续性的502。 这里只讨论第一种情况——间歇性的502。

  • 2017-04-02 00:52:26

    php-fpm占用系统资源分析

    由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…?

  • 2017-04-02 00:56:36

    php-fpm占用系统资源分析

    由上图分析,可以看出共有602个进程,其中有601个进程休眠了。这好像有点不对劲,内核进程也就80个左右,加上memcached, nginx, mysqld,也不会超出90个。除了这些,剩下的只有php-fpm管理的php-cgi,难道是…?

  • 2017-04-03 14:23:17

    Android Studio --“Cannot resolve symbol” 解决办法

    Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题。鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 Android Studio,重新 sync gradle,Clean build 都没有用。

  • 2017-04-06 14:59:13

    PHP配置文件详解

    PHP是一个简单易学,功能强大的语言,尤其在Web开发,开发效率高,方便快捷。研究一下php.ini了解PHP相关配置会有好处的,对PHP有更加深入的了解。

  • 2017-04-06 15:00:46

    怎么实时查看mysql当前连接数

    今天有一台mysql服务器突然连接数暴增,并且等待进程全部被锁...因为问题解决不当,导致被骂...OTL 总结:以后要快速定位错误,布置解决方案