华为手机虚拟键盘的坑

作者: 买酱油 | 来源:发表于2017-01-18 13:49 被阅读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来的。。。反正我是这么解决的。。。。。。其他各种办法也试了,没用!

    相关文章

      网友评论

      本文标题:华为手机虚拟键盘的坑

      本文链接:https://www.haomeiwen.com/subject/uezvbttx.html