当前位置: 首页 > news >正文

Android 对于状态栏和导航栏的操作

设置状态栏背景颜色
window.statusBarColor = Color.WHITE
设置状态栏和导航栏的浅色和深色(默认)状态
......//根据背景颜色是否高亮setStatusBarBgColor(ColorUtils.calculateLuminance(Color.WHITE)>=0.5)
......
private fun setStatusBarBgColor(isLightColor: Boolean) {if (isLightColor){if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){val insetsController = window.insetsController//浅色状态栏insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)//浅色导航栏insetsController?.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)}else{window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)// 为了使这个生效,窗口必须请求WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS// 不能请求WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS// 浅色状态栏背景兼容的模式绘制。window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR}}else{if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){val insetsController = window.insetsController//清除状态栏设置insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS)//清除导航栏设置insetsController?.setSystemBarsAppearance(0,WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS)}else{//默认状态栏window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE}}}
侵入式状态栏
// 通知视窗,我们(应用)会处理任何系统视窗(而不是 decor)
window.setDecorFitsSystemWindows(false)
// 或者您可以使用 AndroidX中的 WindowCompat 
// 兼容api30以下的
// view.systemUiVisibility = 
// 通知系统,视窗希望在极端的情况下该如何布局内容。查看文档来获取更具体的信息。
// View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
// 通知系统,视窗希望在导航栏被隐藏的情况下如何布局内容。
// View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
WindowCompat.setDecorFitsSystemWindows(window, false)
计算键盘高度动态设置窗口 处理视觉冲突 

这里可以获取状态栏和导航栏

navigationBars()用于导航的任何系统栏

statusBars()用于显示状态的任何系统栏

ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { v, insets ->val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottomv.setPadding(0,0,0,imeHeight + insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom)// 返回边衬区,这样它们才能够继续在视图树中继续传递下去insets}
隐藏\显示状态栏和导航栏
        /**API 28 以上 状态栏位置上被黑条占领 问题解决 **/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {val lp = window.attributeslp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGESwindow.attributes = lp}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {val controller: WindowInsetsController? = window.decorView.windowInsetsController//从边缘滑动以显示隐藏栏。 无论导航栏的可见性如何,手势导航都有效。//API level 31// controller?.systemBarsBehavior =  WindowInsetsController.BEHAVIOR_DEFAULT//“粘性沉浸模式”。 从边缘滑动以暂时显示隐藏栏。controller?.systemBarsBehavior =  WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE//WindowInsets.Type.navigationBars() (底部)导航栏//WindowInsets.Type.statusBars() (顶部)状态栏//WindowInsets.Type.systemBars() (底部和顶部)系统栏if(false) controller?.show/*显示*/(WindowInsets.Type.systemBars())else controller?.hide/*隐藏*/(WindowInsets.Type.systemBars())} else {window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE// 将内容设置为显示在系统栏下方,以便在系统栏隐藏和显示时内容不会调整大小。or View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN//隐藏导航栏和状态栏or View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_FULLSCREEN)}

相关文章:

  • Python之numpy数组学习(五)——广播
  • python实现PDF表格与文本分别导出EXCEL
  • 在本地模拟C/S,Socket套接字的使用
  • ChatGPT专业术语及有效使用方法概述
  • 城市群(Megalopolis)/城际(inter-city)OD相关研究即Open Access数据集调研
  • java面试--线程总结
  • openGauss学习笔记-108 openGauss 数据库管理-管理用户及权限-用户
  • Powershell脚本自动备份dhcp数据库
  • 【爬虫】python打包可执行程序(ui界面制作完成后)
  • Maven第三章:IDEA集成与常见问题
  • Jmeter性能测试:高并发分布式性能测试
  • Rust所有权
  • Linux UWB Stack实现——FiRa会话状态机
  • Linux下导出dump文件(Oracle和PG数据)
  • Python第三方库安装——使用vscode、pycharm安装Python第三方库
  • 【译】理解JavaScript:new 关键字
  • 2017前端实习生面试总结
  • Angular 响应式表单之下拉框
  • CSS 提示工具(Tooltip)
  • java2019面试题北京
  • java第三方包学习之lombok
  • Java教程_软件开发基础
  • 高度不固定时垂直居中
  • 和 || 运算
  • 基于webpack 的 vue 多页架构
  • 记一次用 NodeJs 实现模拟登录的思路
  • 利用DataURL技术在网页上显示图片
  • 聊一聊前端的监控
  • 扑朔迷离的属性和特性【彻底弄清】
  • 线上 python http server profile 实践
  • 学习使用ExpressJS 4.0中的新Router
  • 运行时添加log4j2的appender
  • #include
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (6)添加vue-cookie
  • (9)STL算法之逆转旋转
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (区间dp) (经典例题) 石子合并
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net网站发布-允许更新此预编译站点
  • .Net中的集合
  • .sys文件乱码_python vscode输出乱码
  • ??javascript里的变量问题
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @RequestParam详解
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [AAuto]给百宝箱增加娱乐功能
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [BJDCTF2020]The mystery of ip1