华为手机虚拟键盘的坑
ps:设置的状态透明,导致虚拟按键遮住底部布局。然后各种搜索“虚拟按键遮住布局”
都是要设置成这样:以下copy来的
//===========华丽的分割线==========
查了一下有这么几种解决方案:
1.false,设置android:windowTranslucentNavigation为false
因api要求比较高没有验证
2.在布局的父节点设置android:fitsSystemWindows="true"
在我的应用中无效,有些人说有效,有些人说底部是好了,顶部出现问题了啊,状态栏废了。具体效果自己验证
3.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//===========华丽的分割线==========
我的项目里在华为V8上面,这些都试过了,甚至我把沉浸式状态都去掉了,底部还是这样的,遮住了!总之是无效无效!!! 也找不到问题的地方!
最后解决办法,在底部加了一个 黑色的背景的 View 高度是获取虚拟按键的高度,动态设置。
再根据判断是否有虚拟按键来控制是否显示这个View。
// 获取是否存在NavigationBar
private boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
Resources rs = context.getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
/** 获取虚拟功能键高度 */
public int getVirtualBarHeigh() {
int vh = 0;
WindowManager windowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics dm = new DisplayMetrics();
try {
@SuppressWarnings("rawtypes")
Class c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, dm);
vh = dm.heightPixels - windowManager.getDefaultDisplay().getHeight();
} catch (Exception e) {
e.printStackTrace();
}
return vh;
}
以上两个方法也是copy来的。。。反正我是这么解决的。。。。。。其他各种办法也试了,没用!