Android判断底部虚拟导航栏是否存在并获取其高度
- 需求是获取底部虚拟导航栏的高度,首先想到可以通过反射原理获取.同理获取状态栏高度也可通过该方法:将"navigation_bar_height"换成"status_bar_height"即可
try {
Class> clazz = Class.forName("com.android.internal.R$dimen");
Object object = clazz.newInstance();
String heightStr = clazz.getField("navigation_bar_height").get(object).toString();
int height = Integer.parseInt(heightStr);
//dp--->px
statusHeight = context.getResources().getDimensionPixelSize(height);
} catch (Exception e) {
e.printStackTrace();
}
【Android判断底部虚拟导航栏是否存在并获取其高度】2.通过测试高度是获取到了,不过出现了个问题.部分手机没有导航栏,有的手机可以设置开关等,但底部导航栏仍然能获取到值,怎么办? 系统并没有提供相应api让我们直接调用判断开关等信息.其实我们可以通过 虚拟导航栏的高度 = 屏幕高度 - 内容高度 这个公式来判断 当有虚拟导航栏时 屏幕高度 - 内容高度为0 反之则>0 .好了,解决了.奉上代码:
/**
* 横屏可通过 widthPixels - widthPixels2 > 0 来判断底部导航栏是否存在
* @param windowManager
* @return true表示有虚拟导航栏 false没有虚拟导航栏
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public boolean isNavigationBarShow(WindowManager windowManager)
{
Display defaultDisplay = windowManager.getDefaultDisplay();
//获取屏幕高度
DisplayMetrics outMetrics = new DisplayMetrics();
defaultDisplay.getRealMetrics(outMetrics);
int heightPixels = outMetrics.heightPixels;
//宽度
int widthPixels = outMetrics.widthPixels;
//获取内容高度
DisplayMetrics outMetrics2 = new DisplayMetrics();
defaultDisplay.getMetrics(outMetrics2);
int heightPixels2 = outMetrics2.heightPixels;
//宽度
int widthPixels2 = outMetrics2.widthPixels;
return heightPixels - heightPixels2 > 0 || widthPixels - widthPixels2 > 0;
}
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备