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

来源:互联网 发布:classic动作数据mmd 编辑:程序博客网 时间:2024/06/05 11:56

需求

  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;                    }        };
0 0