Android画板(一):软键盘遮挡输入焦点的完美解决方案

一、常规布局软键盘遮挡输入焦点解决方案

有时候我们会遇到这种输入焦点比较靠下的情况,常规情况下会使用:

android:windowSoftInputMode="adjustResize"
android:windowSoftInputMode="adjustPan"

以下为屏幕剩余空间较多的情况:


Android画板(一):软键盘遮挡输入焦点的完美解决方案_第1张图片
软键盘显示方式对比一

以下为屏幕剩余空间较少的情况:

Android画板(一):软键盘遮挡输入焦点的完美解决方案_第2张图片
软键盘显示方式对比二

结论:
adjustRezise:压缩布局空余空间供软键盘显示
adjustPan:整体上移布局供软键盘显示

这样就可以根据需要来选择自己适合的方式来显示软键盘了,一般建议使用:adjustPan

二、PopupWindow中软键盘遮挡输入焦点解决方案

不过一旦被遮挡的是PopupWindow内的输入焦点,那么adjustResize/adjustPan的设置就都没效果了。(经读者反馈,如下面方法无效,可额外加上adjustPan就可以了)
详见下图:


Android画板(一):软键盘遮挡输入焦点的完美解决方案_第3张图片
adjustResize/adjustPan无法解决的情况

那么我们能否通过手动上移布局来解决软键盘遮挡的问题呢?
通过对根View的布局监器听OnGlobalLayoutListener即可实现,代码如下:

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_white_board, container, false);
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //下面的代码主要是为了解决软键盘弹出后遮挡住文字录入PopWindow的问题
                Rect r = new Rect();
                rootView.getWindowVisibleDisplayFrame(r);//获取rootView的可视区域
                int screenHeight = rootView.getHeight();//获取rootView的高度
                keyboardHeight = screenHeight - (r.bottom - r.top);//用rootView的高度减去rootView的可视区域高度得到软键盘高度
                if (textOffY > (sketchViewHeight - keyboardHeight)) {//如果输入焦点出现在软键盘显示的范围内则进行布局上移操作
                    rootView.setTop(-keyboardHeight);//rootView整体上移软键盘高度
                    //更新PopupWindow的位置
                    textPopupWindow.update(mSketchView, x, y,
                            WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT);
                }
            }
        });
        ...
        return rootView;
    }

实现效果如下图:


Android画板(一):软键盘遮挡输入焦点的完美解决方案_第4张图片
解决popupWindow遮挡问题

完整代码可在我的画板开源项目下载:
https://github.com/dsbGenius/testWB

你可能感兴趣的:(Android画板(一):软键盘遮挡输入焦点的完美解决方案)