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

        };
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值