欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软键盘上添加表情键盘切换按钮,点击切换时软键盘显示问题

程序员文章站 2022-07-12 15:17:57
...

软键盘上添加表情键盘切换按钮,引发的异常

最近开发新项目涉及到了一些输入框的问题,UI设计师设计了点击EditText弹起软键盘,软键盘上面有一个表情和键盘切换按钮,用来进行表情键盘和文字键盘的切换。如下:
软键盘上添加表情键盘切换按钮,点击切换时软键盘显示问题
一看到这个UI感觉也没什么难的就开始写了,后来是越测试越多坑,难受了好一阵,还好最后解决了,这里记录下问题产生原因和解决办法。

发现的问题

  1. 点击表情切换按钮时,每次都发现软键盘监听执行了两次
KeyboardUtils.registerSoftInputChangedListener(this, height -> {
            Log.d(TAG, "onSoftInputChanged: " + height);
 });
  1. 点击表情按钮时的onClickListener()监听,总是在软键盘的监听事件registerSoftInputChangedListener之后执行.以至于在onClickListener监听中的代码无法得到有效执行.
 case R.id.iv_emoji_keyboard_switch: //表情和键盘切换按钮
      Log.d(TAG, "onClick:");
      //切换键盘和表情
      ...
      break;

问题原因

后来无意中发现点击软键盘外区域,软键盘会进行销毁.然后通过测试发现当点击表情和键盘切换按钮,会先触发按钮的onTouchListener,后触发onClickListener事件,当触发了setOnTouchListener事件时,就会触发销毁软键盘事件.软键盘会先进行销毁,软化再执行onClickListener中的切换键盘和表情代码,而切换表情和键盘的代码中也有隐藏键盘的方法,就造成了软键盘监听监听到了两次关闭事件.

解决问题

上面发现了问题,接下来就是解决问题了.
我们可以在表情按钮和表情按钮的父布局中分别添加防止软键盘销毁的代码,如下:

 mIvEmojiKeyBoard.setOnTouchListener((v, event) -> {
            noDismissSoftInput();
            return false;
        });

        mRlKeyboardEmojiSwitch.setOnTouchListener((v, event) -> {
            noDismissSoftInput();
            return true;
        });
    private void noDismissSoftInput() {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        assert imm != null;
        imm.showSoftInput(mEtIssueContent, InputMethodManager.SHOW_FORCED);
        mEtIssueContent.requestFocus();
    }

这样可以防止在点击表情和键盘切换按钮时,触发表情键盘切换按钮和它的父布局的onTouchListener时,软键盘销毁.
这时候就可以在表情和软键盘切换按钮的onClickListener事件中做需要的操作了.