关于Android开发的那些事儿

华为手机虚拟键盘的坑

2017-01-18  本文已影响553人  买酱油

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来的。。。反正我是这么解决的。。。。。。其他各种办法也试了,没用!

上一篇下一篇

猜你喜欢

热点阅读