判断是否存在底部导航栏
方式一
//获取是否存在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