已解决
Android 对于状态栏和导航栏的操作
来自网友在路上 179879提问 提问时间:2023-10-27 15:25:40阅读次数: 79
最佳答案 问答题库798位专家为你答疑解惑
设置状态栏背景颜色
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)}
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"Android 对于状态栏和导航栏的操作":http://eshow365.cn/6-26131-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 【Java基础学习打卡21】流程控制
- 下一篇: HarmonyOS 音频通话开发指导