Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)

这篇具有很好参考价值的文章主要介绍了Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文章分以下内容:

  1. 沉浸式状态栏的实现
  2. 沉浸式导航栏的实现
  3. 适配实现沉浸式状态栏后导致的布局偏移
  4. 其他常见问题

一、沉浸式状态栏的实现

该方法用于表示内容是否超出至状态栏和底部导航栏显示,false表明超出。(这也就我们实现沉浸式后需要做适配的原因)

WindowCompat.setDecorFitsSystemWindows(window, false)

注意:当使用setDecorFitsSystemWindows()时,注意不要使用View.setSystemUiVisibility(),因为在源码中,对于Android4.1-10的手机仍旧采用了setSystemUiVisibility方法实现沉浸式。

Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)

设置状态栏透明

window.statusBarColor = Color.TRANSPARENT

二、沉浸式导航栏的实现

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            //当背景透明时去掉灰色蒙层
            window.isNavigationBarContrastEnforced = false
        }

        //导航栏颜色透明
        window.navigationBarColor = Color.TRANSPARENT

三、处理状态栏UI与布局内容产生的重叠

实现沉浸式后我们会发现,布局内容与状态栏、底部导航栏叠加在一起了,为了避免应用UI与系统UI产生重叠,所以我们要对其进行偏移。

Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)

Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)

 首先通过这个方法,获取insets。参数填入window.decorView,当然也可以使用位于实现沉浸式的页面的view,

   ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
        
        }

那么insets具体是什么呢?实际上insets是描述一组用于窗口内容的插入。说人话就是:我们可以从insets中获取包括状态栏,导航栏等系统UI的位置距离,然后用于调整我们的应用UI的位置。接下来我们就来看如何实现

   ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
          
          val systemWindow=insets.getInsets(WindowInsetsCompat.Type.systemBars() or 
                                      WindowInsetsCompat.Type.displayCutout())
           
          //为需要偏移的view设置padding
          moveView.setPadding(0,systemWindow.top,0,0)

            insets
        }

通过inset.getInsets()获取对应的系统UI的信息, 我们也可以通过 “or” 同时获取多种系统栏的距离。例如我们可以同时获取系统的状态栏和刘海屏高度,如果刘海屏的高度更高则返回的是刘海屏的高度。

因为沉浸式所导致的底部布局与导航栏重叠问题也一样迎刃而解了。

view.setPadding(0,0,0,systemWindow.bottom)

WindowInsetsCompat.Type参数解释:

WindowInsetsCompat.Type.ime();//键盘
WindowInsetsCompat.Type.displayCutout();//刘海屏
WindowInsetsCompat.Type.statusBars();//状态栏
WindowInsetsCompat.Type.navigationBars();//导航栏
WindowInsetsCompat.Type.captionBar();//标题栏
WindowInsetsCompat.Type.systemBars();//状态栏,导航栏和标题栏
WindowInsetsCompat.Type.systemGestures();//系统手势 
WindowInsetsCompat.Type.mandatorySystemGestures();//强制性系统手势
WindowInsetsCompat.Type.tappableElement();//可点击区域

四、其他常见问题

状态栏字体颜色修改:

//状态栏字体改为白色
WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = false

//状态栏字体改为黑色
WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightStatusBars = true

导航栏按钮颜色修改: 

WindowCompat.getInsetsController(window,window.decorView).isAppearanceLightNavigationBars= false

用这个方法的时候会导致状态栏字体变成白色,目前我的解决办法是重新再设置一次状态栏字体颜色,如果你有更好的解决方法欢迎在评论区留言。文章来源地址https://www.toymoban.com/news/detail-443375.html

到了这里,关于Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android11 如何修改状态栏的背景

    修改status_bar.xml :

    2024年04月16日
    浏览(32)
  • Android隐藏导航栏和状态栏的方法

    一。去除状态栏 以下是Android去除状态栏的代码示例: 1. 在Activity的onCreate()方法中添加以下代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 2. 在AndroidManifest.xml文件中的Activity节点中添加以下属性: android:theme=\\\"@android:style/Theme.NoTitleB

    2024年02月16日
    浏览(38)
  • 史上最完美的Android沉浸式状态导航栏攻略

    最近我在小破站开发一款新App,叫 高能链 。我是一个完美主义者,所以不管对架构还是UI,我都是比较抠细节的,在状态栏和导航栏沉浸式这一块,我还是踩了挺多坑,费了挺多精力的。这次我将我踩坑,适配各机型总结出来的史上最完美的Android沉浸式状态导航栏攻略分享

    2023年04月26日
    浏览(38)
  • Android全屏弹出Dialog显示状态栏和导航栏的问题及解决方案

    在移动端开发中,有时候我们需要在Android应用中弹出一个全屏的Dialog。然而,当我们尝试实现这样的Dialog时,可能会遇到一个问题:状态栏和导航栏在全屏Dialog中仍然可见,这可能会影响用户体验。本文将介绍如何解决这个问题,并提供相应的源代码。 问题描述: 当我们使

    2024年02月05日
    浏览(40)
  • android 布局 横屏 android横屏适配

    一、刘海屏适配 1、layoutInDisplayCutoutMode属性 Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 这是一种默认的属性,在不进行明确指定的情况下,系统会自动使用这种属性。这种属性允许应用程

    2024年02月09日
    浏览(35)
  • 微信小程序如何实现自定义导航栏、导航栏手机适配(获取导航栏、状态栏高度和胶囊位置)以及踩过的坑

    背景:不用官方默认的导航栏,想用自己自定义的 实现效果: :顶部状态栏、顶部导航栏、顶部状态导航栏、胶囊 原理: 自定义导航栏无非就是求得导航栏高度,并让内容容器垂直方向居中于导航栏高度 1.获取手机系统状态栏高度 2.获取胶囊位置(包括高度) 3.求得

    2024年03月12日
    浏览(60)
  • Android沉浸式实现(记录)

    沉浸式先看效果 直接上代码 Android manifest文件 布局文件 Java MainActivity.class文件 注意点

    2024年02月11日
    浏览(91)
  • Android状态栏布局隐藏的方法

    2024年01月23日
    浏览(37)
  • Android问题笔记 -如何实现代码控制自动旋转开关的变更以及当前状态

    专栏分享 点击跳转=Unity3D特效百例 点击跳转=案例项目实战源码 点击跳转=游戏脚本-辅助自动化 点击跳转=Android控件全解手册 点击跳转=Scratch编程案例 点击跳转=软考全系列 众所周知,人生是一个漫长的流程,不断 克服困难 ,不断反思前进的过程。在这个过程中会产生很多对

    2024年02月08日
    浏览(44)
  • Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

    要在 Android 应用中全局检测软键盘的弹起,您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时,布局树会发生变化,因此您可以在监听器中捕获这些变化。 在上面的代码中, rootView 是您布局的根视图,您需要将其替换为您实际布局

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包