Android 输入法布局改变的页面适配

需求

  1. 点击评论输入弹出软键盘
  2. 点击评论区的Emoji按钮,切换至Emoji输入
  3. 点击评论区的图片按钮,插入图片

难点

  1. 切换输入法的时候,自动调整Emoji和图片区域适应键盘高度。
  2. 当切换至全屏手写,半屏手写时,软键盘高度变化。若软键盘高度变大,输入框会上移;若软键盘高度减少,输入框不会下移。手动调整输入框位置,发现输入框的布局位置已固定,下移会导致输入框不可见,不能解决该问题。最后的解决方案是,手动关闭软键盘,延时10ms再弹出,强制系统重新调整布局。

方案

  1. 点击评论输入弹出软键盘
    EditText的TouchListeer
  2. 点击评论区的Emoji按钮,切换至Emoji输入
    onClickListener
  3. 点击评论区的图片按钮,插入图片
    onClickListener
  4. 切换输入法的时候,自动调整Emoji和图片区域适应键盘高度。
    EditText的getViewTreeObserver().addOnGlobalLayoutListener
        listener = new ViewTreeObserver.OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

                if (getActivity() != null) {
                    int keyboardHeight = getKeyboardHeight(rootView);
                    mIsKeyboardShown = (keyboardHeight > 0);

                    switch (mInputMode) {
                        //弹出软键盘
                        case IM_KEYBOARD_SHOWN:
                            if (keyboardHeight > 0) {
                                if (mKeyboardHeight != keyboardHeight) {
                                    mKeyboardHeight = keyboardHeight;
                                    //调整布局高度
                                }
                                mInputMode = IM_KEYBOARD_INPUT;
                            }
                            break;
                        //软件盘已弹出
                        case IM_KEYBOARD_INPUT:
                            if (keyboardHeight == 0) {
                                hideInputView(holder, false);
                            } else if (keyboardHeight > 0) {
                                if (mKeyboardHeight != keyboardHeight) {
                                    if (mKeyboardHeight > keyboardHeight) {
                                       //强制关闭软键盘
                                  getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
                                       //延时,强制显示软键盘
                                                                     inputManager.hideSoftInputFromWindow(holder.editor.getWindowToken(), 0);
                                        holder.editor.postDelayed(new Runnable() {

                                            @Override
                                            public void run() {
                                                getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
                                                inputManager.showSoftInput(holder.editor, InputMethodManager.SHOW_FORCED);
                                            }
                                        }, 10);
                                    }
                                    mKeyboardHeight = keyboardHeight;
                                    //调整布局高度
                                }
                            }
                            break;
                    }

        };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章