Android手机软键盘遮挡布局控件

在Activity中的布局的下方有EditText获取焦点弹出软键盘的时候,如果不作处理,软键盘可能会遮挡输入框或者一些按键,这样的用户体验比较差。
这里整理了几种处理方式,可以使页面整体上移。并且提供一种个人比较喜欢的方法。

网上常见的三种:

  • 1.修改AndroidManifest.xml文件
Android:windowSoftInputMode="stateVisible|adjustResize"
  • 2.在Activity中添加配置

在activity中的onCreate中setContentView之前写上这个代码:

 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

其实第二中方式与第一种是一样的,只不过放的位置不同而已。

  • 3.在布局文件中添加ScrollView

把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView。
这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。

个人推荐

上面三种都是比较简单处理,但灵活性较低。软键盘使整体上移可能造成一些控件上移出屏幕无法展示。以下方式就可以比较灵活的控制底部显示的控件是什么。

先看下效果图:

软键盘.gif

将如下方法放到onCreate初始化View之后就可以。

    /**
     * 1、获取main在窗体的可视区域
     * 2、获取main在窗体的不可视区域高度
     * 3、判断不可视区域高度
     *   ①大于180:键盘显示  获取Scroll的窗体坐标,算出main需要滚动的高度,使scroll显示。
     *   ②小于180:键盘隐藏
     *   该值根据屏幕可以做出修改,在大屏手机上可以适当的调大,不然会出现问题。
     *
     * @param main   根布局
     * @param scroll 需要显示的最下方View
     */
    public void addLayoutListener(final View main, final View scroll) {
        main.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
            Rect rect = new Rect();
            main.getWindowVisibleDisplayFrame(rect);
            int mainInvisibleHeight = main.getRootView().getHeight() - rect.bottom;

            if (mainInvisibleHeight > 180) {
                int[] location = new int[2];
                scroll.getLocationInWindow(location);
                int scrollHeight = (location[1] + scroll.getHeight() + ((RelativeLayout.LayoutParams) scroll.getLayoutParams()).bottomMargin) - rect.bottom;
                if (scrollHeight > 0) {
                    main.scrollTo(0, scrollHeight);
                }
            } else {
                main.scrollTo(0, 0);
            }
        });
    }

你可能感兴趣的:(Android手机软键盘遮挡布局控件)