Android 关于底部导航栏遮挡问题

判断是否存在底部导航栏

方式一
//获取是否存在NavigationBar
    fun checkDeviceHasNavigationBar(context: Context): Boolean {
        var hasNavigationBar = false
        val rs = context.resources
        val id = rs.getIdentifier("config_showNavigationBar", "bool", "android")
        if (id > 0) {
            hasNavigationBar = rs.getBoolean(id)
        }
        try {
            val systemPropertiesClass = Class.forName("android.os.SystemProperties")
            val m = systemPropertiesClass.getMethod("get", String::class.java)
            val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String
            if ("1" == navBarOverride) {
                hasNavigationBar = false
            } else if ("0" == navBarOverride) {
                hasNavigationBar = true

            }
        } catch (e: Exception) {
            Log.e("Exxxxxxxxxxx",e.message)
            e.printStackTrace()
        }

        return hasNavigationBar

    }

有的手机可以对底部导航栏进行设置,如果直接通过这种方式 判断会导致这类手机也默认存在底部导航栏 出现下方空白

方式二
  /**
     * 横屏可通过 widthPixels - widthPixels2 > 0 来判断底部导航栏是否存在
     * @param windowManager
     * @return true表示有虚拟导航栏 false没有虚拟导航栏
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    fun isNavigationBarShow(windowManager: WindowManager): Boolean {
        val defaultDisplay = windowManager.defaultDisplay
        //获取屏幕高度
        val outMetrics = DisplayMetrics()
        defaultDisplay.getRealMetrics(outMetrics)
        val heightPixels = outMetrics.heightPixels
        //宽度
        val widthPixels = outMetrics.widthPixels


        //获取内容高度
        val outMetrics2 = DisplayMetrics()
        defaultDisplay.getMetrics(outMetrics2)
        val heightPixels2 = outMetrics2.heightPixels
        //宽度
        val widthPixels2 = outMetrics2.widthPixels

        return heightPixels - heightPixels2 > 0 || widthPixels - widthPixels2 > 0
    }

这个是网上找到通过 虚拟导航栏的高度 = 屏幕高度 - 内容高度 这个公式来判断 当有虚拟导航栏时 屏幕高度 - 内容高度为0 反之则>0

获取底部导航栏高度

    /**
     * 获取底部导航栏高度
     * @param context
     * @return
     */
    fun getNavigationBarHeight(context: Context): Int {
        val resources = context.resources
        val resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android")
        val height = resources.getDimensionPixelSize(resourceId)
        return height
    }

给view设置 padding

        val view=LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true)
        if(isNavigationBarShow(windowManager)){
            view.setPadding(0, 0, 0, getNavigationBarHeight(this));
        }else {
            view.setPadding(0, 0, 0, 0)
        }

参考

https://blog.csdn.net/weixin_43258668/article/details/106143639
https://www.jianshu.com/p/68e6df9d745d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值