我有一个应用,其中某些视图需要全屏显示,而其他视图则不需要全屏显示。在某些情况下,我希望背景显示在状态栏下,因此在加载视图以使活动全屏显示时可以使用它:
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
window.statusBarColor = Color.TRANSPARENT
,然后在其他视图中,我可以将其切换回非全屏状态,并以纯色显示状态栏,以便在加载这些视图时使用:
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
window.statusBarColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)
但是,当我在这些视图之间切换时,整个视图将被statusBar的大小所抵消,从全屏变为非全屏,整个视图太低并且低于导航栏,反之则导致整个视图视图过高,在导航栏和视图底部之间留有一些空白。
我尝试在设置标志以使其重绘后调用invalidate()
,但似乎无济于事。我可以再打个电话来解决因更改窗口标志而引起的偏移吗?
编辑:
要提供更多信息-我不在活动之间切换,我只是在活动中显示哪个视图。附加我的视图后,我将发出呼叫来更改decorView标志
答案 0 :(得分:0)
好吧,所以我找到了一种方法来实现这一点,不确定是否理想,但它是否可以正常工作...本质上,我只是始终使该应用程序处于全屏状态,并从内容视图中手动添加/删除填充以使其在状态栏后面展开是否。
这是实现:
首先,我将窗口标志设置为以下内容:
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
然后在我的父视图中,我有以下电话:
val statusBarHeight: Int
get() {
var result = 0
val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceId > 0) {
result = resources.getDimensionPixelSize(resourceId)
}
return result
}
private var shouldShowBlueBar: Boolean = false
private fun hideSystemUI() {
// registered main view is the content view and I'm, setting it it to have
// no padding so it goes right to the top of the screen and shows under the
// status bar
registered_main_view.setPadding(0, 0, 0 ,0)
window.statusBarColor = Color.TRANSPARENT
}
private fun showSystemUI() {
// here I put padding that is the height of the status bar to keep the
// main content view below the status bar
registered_main_view.setPadding(0, statusBarHeight, 0 ,0)
window.statusBarColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)
}
override fun toggleHeaderBlue(showBar: Boolean) {
shouldShowBlueBar = showBar
if (shouldShowBlueBar) {
showSystemUI()
} else {
hideSystemUI()
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (shouldShowBlueBar)
showSystemUI()
else
hideSystemUI()
}
,当我需要在显示状态栏或不显示状态栏之间进行切换时,只需调用toggleHeaderBlue()。