美文网首页
Android 全屏沉浸式(隐藏状态栏和导航栏)的一些设置

Android 全屏沉浸式(隐藏状态栏和导航栏)的一些设置

作者: 小强开学前 | 来源:发表于2020-05-19 15:37 被阅读0次

效果:进入后状态栏、导航栏隐藏,手势滑动显示,2s后又自动隐藏

  • style设置全屏(或者代码中设置)
        <!--启用全屏-->
        <item name="android:windowFullscreen">true</item>
  • 在BaseActivity中设置沉浸模式
// 方法1,在onCreate中设置以下代码
hideSystemUiVisibility()
window.decorView.setOnSystemUiVisibilityChangeListener {
      hideSystemUiVisibility()
}

// 方法2,重写 onWindowFocusChanged
override fun onWindowFocusChanged(hasFocus: Boolean) {
      super.onWindowFocusChanged(hasFocus)
      if (hasFocus) hideSystemUiVisibility()
}
// 设置沉浸模式
private fun hideSystemUiVisibility() {
        window.decorView.systemUiVisibility =
            View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
}
  • 对特殊控件的处理(显示前取消焦点,显示后再加上焦点,避免FLAG改变)

    • Dialog类的处理

    重写show方法

        override fun show() {
        window?.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        super.show()
        window?.decorView?.systemUiVisibility =
            View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    }
    
    • PopUpWindow类的处理

    重写showAsDropDown方法

    override fun showAsDropDown(anchor: View?, xoff: Int, yoff: Int, gravity: Int) {
        isFocusable = false
        super.showAsDropDown(anchor, xoff, yoff, gravity)
        contentView.systemUiVisibility =     View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        isFocusable = true
        update()
    }
    
    • Spinner类的处理

    通过Kotlin拓展方法,取消其焦点获取

    fun Spinner.avoidDropdownFocus() {
        try {
            val listPopup = Spinner::class.java.getDeclaredField("mPopup").apply { isAccessible = true }.get(this)
            if (listPopup is ListPopupWindow) {
                val popup = ListPopupWindow::class.java.getDeclaredField("mPopup").apply { isAccessible = true }.get(listPopup)
                if (popup is PopupWindow) {
                    popup.isFocusable = false
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
    • 还有谁???

不隐藏状态栏的完美解决方法(5.0以后):

 <item name="android:statusBarColor">@android:color/transparent</item>

配合

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE

让在有抽屉的界面上面还是会有一层半透明遮罩
这时候需要在NavigationView中设置app:insetForeground="#00000000"

当然,一般设备和一般界面设置windowTranslucentStatus为true这一个属性就搞定了。
但是这种在锤子坚果R1上仍然有半透明遮罩,即使强行再设置statusBarColor 为自己想要的颜色,有抽屉界面即使按照上面方法设置了还是会有一层半透明遮罩,这个应该是系统默认的实现方式。

所以,还是别怕麻烦了。

相关文章

网友评论

      本文标题:Android 全屏沉浸式(隐藏状态栏和导航栏)的一些设置

      本文链接:https://www.haomeiwen.com/subject/mwlbohtx.html