美文网首页
Android NavigationBar(虚拟导航栏)显示隐藏

Android NavigationBar(虚拟导航栏)显示隐藏

作者: 椰子 | 来源:发表于2020-10-14 14:47 被阅读0次

项目中有个需求,需要根据虚拟导航栏的显示、隐藏状态,动态修改页面中控件的高度来适配,尝试过网上很多计算页面显示高度来动态检测NavigationBar显示隐藏的方法,基本都不太好使,后来发现以下方案比较好用:

UIExt.kt

/**
 * 虚拟导航栏显示、隐藏监听
 * 该方法只有在导航栏发生变化时才会触发
 */
@SuppressLint("ObsoleteSdkInt")
fun isNavigationBarChanged(
    activity: Activity,
    onNavigationStateListener: OnNavigationStateListener?
) {
    val height: Int = getNavigationBarHeight(activity)
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        ViewCompat.setOnApplyWindowInsetsListener(activity.window.decorView) { v, insets ->
            var isShowing = false
            var b = 0
            if (insets != null) {
                b = insets.systemWindowInsetBottom
                isShowing = b == height
            }
            if (onNavigationStateListener != null && b <= height) {
                onNavigationStateListener.onNavigationState(isShowing, b)
            }
            ViewCompat.onApplyWindowInsets(v,insets)
        }
    }
}

interface OnNavigationStateListener {
    fun onNavigationState(isShowing: Boolean, b: Int)
}

/**
 * 获取虚拟导航栏高度 方法1
 */
fun getNavigationBarHeight(context: Context): Int {
    val resources = context.resources
    val resourceId: Int = resources.getIdentifier("navigation_bar_height", "dimen", "android")
    return resources.getDimensionPixelSize(resourceId)
}

使用:
因为要动态监听,比如在应用中切到系统设置去开关了虚拟导航栏再回到应用里,所以写在onWindowFocusChanged回调中比较合适。

MainActivity.kt

override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        isNavigationBarChanged(this, object : OnNavigationStateListener {
            override fun onNavigationState(isShowing: Boolean, b: Int) {
                LogUtils.logE("isNavigationBarExist---${isShowing}")
                //todo 根据showing的值去写自己的逻辑
            }
        })
    }

相关文章

网友评论

      本文标题:Android NavigationBar(虚拟导航栏)显示隐藏

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