如图键盘把输入框盖掉了,项目中使用的是,获取真实的键盘显示时的高度
react-native-extra-dimensions-android
解决方法:
ExtraDimensionsModule.java中修改,加入红色部分。。
因为普通项目中使用此插件不会有问题,因为我们的项目中执行了两次createReactManager,调用了两次getPackages...固引发血案发生,这里存档下
private float getSoftMenuBarHeight(DisplayMetrics metrics) { final float realHeight = getRealHeight(metrics); final Context ctx = getReactApplicationContext(); final DisplayMetrics usableMetrics = ctx.getResources().getDisplayMetrics(); ((WindowManager) mReactContext.getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay().getMetrics(metrics); final int usableHeight = usableMetrics.heightPixels; float result = Math.max(0, realHeight - usableHeight / metrics.density); DisplayMetricsHolder.initDisplayMetrics(mReactContext); return result; }
分析:
android.view.Display.java中有两个方法
display.getRealMetrics(DisplayMetrics outMetrics)// 获取真实的,包含虚拟bar
display.getMetrics(DisplayMetrics outMetrics) // 不一定准确的,不包含虚拟bar
使用DisplayMetricsHolder.initDisplayMetrics(Context context)指定使用getRealMetrics方法 在extraDimensionsModule.getSoftMenuBarHeight(DisplayMetrics metrics)方法中将全局维护的metrics设置成了getMetrics, (这里是使用getMetrics,是为了获取SoftMenuBarHeight的高度)。
所以第二次执行
ExtraDimensionsModule.getRealHeight的时候需要重置一下我们用到的getRealMetrics
一切的开始是:ReactInstanceManager.builder() 方法中调用
DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(applicationContext);
二次执行时,如果全局的
DisplayMetrics不为空则直接返回,恰好第二次初始化ReactInstanceManager时,全局持有一个了通过
getMetrics的,而非getRealMetrics的对象