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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您使用的是Flutter自带的BottomSheet,那么它会默认覆盖整个屏幕,包括导航栏。不过,您可以通过自定义BottomSheet来解决这个问题。 首先,您需要创建一个继承自StatefulWidget的类,用来显示底部模态。在这个类中,您需要定义一个变量来保存底部模态的高度: ```dart class CustomBottomSheet extends StatefulWidget { @override _CustomBottomSheetState createState() => _CustomBottomSheetState(); } class _CustomBottomSheetState extends State<CustomBottomSheet> { double _height = 0.0; @override Widget build(BuildContext context) { return Container( height: _height, child: Column( children: [ // 在这里添加您的底部模态内容 ], ), ); } } ``` 然后,在显示底部模态的代码中,您需要使用showModalBottomSheet函数,并将isScrollControlled参数设置为true,以便底部模态可以滚动。接着,您需要将返回的widget包装在一个Builder widget中,这样就可以获取到Scaffold的上下文,从而得到导航栏的高度。最后,您需要在showModalBottomSheet的builder函数中,将CustomBottomSheet作为返回值。 ```dart void _showBottomSheet(BuildContext context) { showModalBottomSheet( context: context, isScrollControlled: true, builder: (context) { return Builder( builder: (scaffoldContext) { final double statusBarHeight = MediaQuery.of(scaffoldContext).padding.top; final double appBarHeight = kToolbarHeight; final double screenHeight = MediaQuery.of(scaffoldContext).size.height; return StatefulBuilder( builder: (context, setState) { return CustomBottomSheet(); }, ); }, ); }, ); } ``` 在CustomBottomSheet中,您需要监听底部模态的高度变化,并将其保存在_height变量中。这可以通过在底部模态中添加一个LayoutBuilder widget来实现。在LayoutBuilder的回调函数中,您可以获取到底部模态的高度,并将其保存在_height变量中。 ```dart class CustomBottomSheet extends StatefulWidget { @override _CustomBottomSheetState createState() => _CustomBottomSheetState(); } class _CustomBottomSheetState extends State<CustomBottomSheet> { double _height = 0.0; @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { if (_height != constraints.maxHeight) { setState(() { _height = constraints.maxHeight; }); } return Container( height: _height, child: Column( children: [ // 在这里添加您的底部模态内容 ], ), ); }, ); } } ``` 这样,您就可以创建一个不会遮挡导航栏的底部模态了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值