viewpager+fragment实现沉浸式状态栏_沉浸式状态栏 viewpager-程序员宅基地

技术标签: android  工具  Android  

MainActivity中使用ViewPager+Fragment的方式作为首页,但是每个fragment有独立的状态栏颜色,同时还要适配刘海屏,水滴屏。

直接上代码:

<!--给APP设置为无标题栏样式,在style下-->

<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
    </style>
    ...
</resources>

如图:

状态栏是一个view,那我们就在代码中设置状态栏的高度

<!--给Fragment的加一个View作为状态栏-->

 <View
    android:id="@+id/view_status"
    android:layout_width="match_parent"
    android:layout_height="5dp"/>

问题来了,刘海屏,水滴屏这么做会存在UI显示问题的,所以就我们只有获取刘海屏,水滴屏状态栏的高度然后给View设置了。

/**
* 获取状态栏高度
*
* @param context
* @return
*/
public static int getStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier(
            "status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

/**
* 设置状态栏高度,颜色
*
* @param view   要设置的状态栏的view
* @param color  要设置的颜色
* @return
*/
public void statusBarClor(View view, int color) {
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(getActivity()));
    view.setLayoutParams(lp);
    view.setBackgroundColor(getResources().getColor(color));
    
    if (Build.VERSION.SDK_INT >= 21) {
        View decorView = getActivity().getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
        getActivity().getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
}

SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:使状态栏出现的时候,不会重新调整activity的高度,状态栏覆盖在activity之上。
SYSTEM_UI_FLAG_LAYOUT_STABLE:让应用的主体内容占用系统状态栏的空间;
setStatusBarColor:使状态栏透明

上面的内容都是一些配置,把statusBarClor()这个方法加入到fragment中即可实现沉浸式状态栏,如图所示:

从图片中看到一个状态栏的字体都没有了,这是因为状态栏字体原本为白色,状态栏背景颜色也设置为了白色,造成重叠,因此接下来改造状态栏字体颜色。

/**
* 设置6.0状态栏深色浅色切换
* @param activity  activity
* @param dark      是否是浅色状态栏  true为浅色
* @return
*/
public static boolean setCommonUI(Activity activity, boolean dark) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        View decorView = activity.getWindow().getDecorView();
        if (decorView != null) {
            int vis = decorView.getSystemUiVisibility();
            if (dark) {
                vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            } else {
                vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
            }
            if (decorView.getSystemUiVisibility() != vis) {
                decorView.setSystemUiVisibility(vis);
            }
            return true;
        }
    }
    return false;
}
将此方法加入进去即可。

 最终效果图

小米,魅族需要单独做适配,代码如下,判断ROM后加入即可

/**
* 设置MIUI状态栏深色浅色切换
*
* @param activity
* @param dark
* @return
*/
public static boolean setMiuiUI(Activity activity, boolean dark) {
    try {
        Window window = activity.getWindow();
        Class<?> clazz = activity.getWindow().getClass();
        @SuppressLint("PrivateApi") 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.getDeclaredMethod("setExtraFlags", int.class, int.class);
        extraFlagField.setAccessible(true);
        if (dark) {    //状态栏亮色且黑色字体
            extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
        } else {
            extraFlagField.invoke(window, 0, darkModeFlag);
        }
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

/**
* 设置Flyme状态栏深色浅色切换
*
* @param activity
* @param dark
* @return
*/
public static boolean setFlymeUI(Activity activity, boolean dark) {
    try {
        Window window = activity.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
        Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
        darkFlag.setAccessible(true);
        meizuFlags.setAccessible(true);
        int bit = darkFlag.getInt(null);
        int value = meizuFlags.getInt(lp);
        if (dark) {
            value |= bit;
        } else {
            value &= ~bit;
        }
        meizuFlags.setInt(lp, value);
        window.setAttributes(lp);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rabbit_ding0810/article/details/122498782

智能推荐

6款好用的电脑画图工具推荐_电脑画图软件有哪些-程序员宅基地

文章浏览阅读1k次,点赞14次,收藏23次。在我们的日常学习中,我们需要绘制各种各样的图片,无论是科研绘图、平面设计、机械绘图、插图绘图等。绘图似乎已经成为我们日常生活中不可或缺的技能。由于效率问题,我们现在通常在电脑上画画,这不仅可以随时更改,而且可以轻松提高绘图效率。让我们来分析一下市场上使用较多的绘图软件。即时设计 - 可实时协作的专业 UI 设计工具即时设计是一款支持在线协作的专业级 UI 设计工具,支持 Sketch、Figma、XD 格式导入,海量优质设计资源即拿即用。_电脑画图软件有哪些

朔州开发区 3D 可视化 —— 打造全新一代综合性智慧园区_物联网分布可视化展现-程序员宅基地

文章浏览阅读336次。近几年,我国智慧城市建设步伐也不断加快,党中央和国务院也更加注重智慧园区的建设与发展,智慧园区建设与园区产业发展相结合,向着创新化、生态化发展,更加注重高新技术、绿色环保型等产业的发展,将管理创新与园区智能化相结合。园区的发展更新换代,集合如:云计算,物联网,大数据,人工智能,GIS等新兴技术,通过对园区内外的数据和资源进行检测、分析、集成和响应,实现对园区管理信息化、信息传递即时化、基础设施智能化、公共服务便捷化、产业发展现代化、社会治理精细化等,以提高园区产业聚集能力、企业竞争力,并且以园区可持续发_物联网分布可视化展现

springboot(三)--mvc拦截器、web servlet、filter、listener的使用_springboot中拦截器还用webmvc吗-程序员宅基地

文章浏览阅读1.2k次。如题。本篇,我们介绍写springboot (web工程)中mvc拦截器使用以及web servlet、filter、listener的使用。一、mvc拦截器配置、使用 spring mvc拦截器,能够拦截对指定路径的controller的访问 ,但不会拦截对servlet的访问,因为本质上讲springMVC(前端控制器)也是个servlet,试问servlet又怎么能够拦截对ser..._springboot中拦截器还用webmvc吗

“理想男朋友”职业榜单出炉,java程序员是否榜上有名?_理想男友程序员-程序员宅基地

文章浏览阅读588次。而Java程序员作为IT行业中非常重要的职业之一,虽然在女生的职业榜单中并不是排名靠前的理想男友职业之一,但是从职业前景和发展角度来看,Java程序员是一个非常有吸引力的职业。虽然Java程序员在女生的职业榜单中并没有超过医生,但是能在前十名的榜单中也不容易,作为一个优秀的Java程序员,可以获得高薪、稳定的工作和广阔的发展前景,是一个非常值得追求的职业。虽然在女生的职业榜单中,Java程序员并不是排名靠前的理想男友职业之一,但是从职业前景和发展角度来看,Java程序员是一个非常有吸引力的职业。_理想男友程序员

JavaScript初识及基本语法详解-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏22次。JavaScript初识及基本语法详解_javascript

【120期】面试官:谈谈什么是微服务?-程序员宅基地

文章浏览阅读365次。程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 2.8 分钟。来自:https://www.jianshu.com/p/d9504fc0af4d注:本文以面试应答目..._面试官问微服务了解过吗

随便推点

dijkstra算法详解—简单易懂-程序员宅基地

文章浏览阅读10w+次,点赞143次,收藏796次。dijkstra算法详解(迪杰斯特拉算法)~~简单易懂,代码附有详细注释,含动态演示图片_dijkstra算法

牛客网刷题记 | 零散知识点汇总——Java(ing)_零散的刷题无力,记录自己一点一点的进步-程序员宅基地

文章浏览阅读169次。权限main 方法是 Java Application 程序执行的入口点,以下描述哪项是合法的()。继承、重载C++可以多重继承,但是Java中对于类而言,只有单继承,接口可以多继承。Java不能重载运算符,C++可以。接口与抽象类的区别1 .抽象类要被子类继承,接口要被类实现;2 .接口只能做方法声明,抽象类中可..._零散的刷题无力,记录自己一点一点的进步

Angular 使用教程——基本语法和双向数据绑定_angular 教程-程序员宅基地

文章浏览阅读2.1k次。Angular 是一个应用设计框架与开发平台,旨在创建高效而精致的单页面应用Angular 是一个基于 TypeScript 构建的开发平台。它包括:一个基于组件的框架,用于构建可伸缩的 Web 应用,一组完美集成的库,涵盖各种功能,包括路由、表单管理、客户端-服务器通信等,一套开发工具,可帮助你开发、构建、测试和更新代码。借助 Angular,无论单人项目还是企业级应用,你都能获得平台带来的优势。Angular 的设计目标之一就是让更新更容易,因此你可以用最小的成本升级到最新的 Angular 版本。_angular 教程

mysql统计近七天的数据并分组没有的为0_mysql 分组数据没有的指定为0-程序员宅基地

文章浏览阅读1k次。SELECT a.click_date, IFNULL(b.count,0)countFROM (SELECT curdate( ) AS click_date UNION ALLSELECT date_sub( curdate( ), INTERVAL 1 DAY ) AS click_date UNION ALLSELECT date_sub( curdate( ), INTERVAL 2 DAY ) AS click_date UNION ALL..._mysql 分组数据没有的指定为0

Android高效的EPG界面实现方式_epg界面怎么渗透测试-程序员宅基地

文章浏览阅读1.2k次,点赞5次,收藏6次。Android高效的EPG界面实现 你现在没有在为怎么去实现EPG界面而烦恼呢?看了我这篇博客后,肯定会对你有很大的帮助的。我的实现方式最大的特点就是UI响应速度很快(上下左右切换时,UI能很快的刷新数据)。 首先看下效果图: ..._epg界面怎么渗透测试

实例开机显示Booting from Hard Disk-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏6次。尝试编辑编辑/etc/nova/nova.conf[libvirt]cpu_mode = nonevirt_type=qemu修改后需要重启服务[root@compute1~]#[root@compute1~]# systemctl restart openstack-nova-compute.service_booting from hard disk

推荐文章

热门文章

相关标签