美文网首页
android监听软键盘退格(删除)事件

android监听软键盘退格(删除)事件

作者: SmallWalnutBG | 来源:发表于2020-06-08 00:47 被阅读0次

    android监听软键盘退格(删除)事件

    packagecn.deerlands.deerland.mvp.ui.util;importandroid.view.KeyEvent;importandroid.view.View;importandroid.view.inputmethod.InputConnection;importandroid.view.inputmethod.InputConnectionWrapper;/** * Created by tu zhen yu on 2017/12/1. * {@linkInputConnection} 是输入法和View交互的纽带。 * {@linkInputConnectionWrapper} 是 InputConnection 的代理类,可以代理EditText的InputConnection,监听和拦截软键盘的各种输入事件。 * 注:用 {@linkView#setOnKeyListener(View.OnKeyListener)} 监听软键盘的按键点击事件对有些键盘无效(比如谷歌输入法), * 最好用InputConnection去监听。 */publicclassTInputConnectionextendsInputConnectionWrapper{privateBackspaceListener mBackspaceListener;/**    * Initializes a wrapper.    *

        *

    Caveat: Although the system can accept {@code(InputConnection) null} in some    * places, you cannot emulate such a behavior by non-null {@linkInputConnectionWrapper} that    * has {@codenull} in {@codetarget}.

        *    *@paramtarget  the {@linkInputConnection} to be proxied.    *@parammutable set {@codetrue} to protect this object from being reconfigured to target    *                another {@linkInputConnection}.  Note that this is ignored while the target is {@codenull}.    */publicTInputConnection(InputConnection target,booleanmutable){super(target, mutable);    }publicinterfaceBackspaceListener{/**        *@returntrue 代表消费了这个事件        * */booleanonBackspace();    }/**    * 当软键盘删除文本之前,会调用这个方法通知输入框,我们可以重写这个方法并判断是否要拦截这个删除事件。    * 在谷歌输入法上,点击退格键的时候不会调用{@link#sendKeyEvent(KeyEvent event)},    * 而是直接回调这个方法,所以也要在这个方法上做拦截;    * */@OverridepublicbooleandeleteSurroundingText(intbeforeLength,intafterLength){if(mBackspaceListener !=null){if(mBackspaceListener.onBackspace()){returntrue;                }            }returnsuper.deleteSurroundingText(beforeLength, afterLength);    }publicvoidsetBackspaceListener(BackspaceListener backspaceListener){this.mBackspaceListener = backspaceListener;    }/**

        * 当在软件盘上点击某些按钮(比如退格键,数字键,回车键等),该方法可能会被触发(取决于输入法的开发者),

        * 所以也可以重写该方法并拦截这些事件,这些事件就不会被分发到输入框了

        * */@OverridepublicbooleansendKeyEvent(KeyEvent event){if( event.getKeyCode() == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN){if(mBackspaceListener !=null&& mBackspaceListener.onBackspace()){returntrue;            }        }returnsuper.sendKeyEvent(event);    }}

    editText class

    package cn.deerlands.deerland.mvp.ui.wiget;

    import android.content.Context;

    import android.util.AttributeSet;

    import android.view.inputmethod.EditorInfo;

    import android.view.inputmethod.InputConnection;

    import androidx.appcompat.widget.AppCompatEditText;

    import cn.deerlands.deerland.mvp.ui.util.TInputConnection;

    /**

    * Created by tuzhenyu on 2017/12/21.

    */

    public class TEditText extends AppCompatEditText {

        private TInputConnection inputConnection;

        public TEditText(Context context) {

            super(context);

            init();

        }

        public TEditText(Context context, AttributeSet attrs) {

            super(context, attrs);

            init();

        }

        public TEditText(Context context, AttributeSet attrs, int defStyleAttr) {

            super(context, attrs, defStyleAttr);

            init();

        }

        private void init() {

            inputConnection = new TInputConnection(null, true);

        }

        /**

        * 当输入法和EditText建立连接的时候会通过这个方法返回一个InputConnection。

        * 我们需要代理这个方法的父类方法生成的InputConnection并返回我们自己的代理类。

        */

        @Override

        public InputConnection onCreateInputConnection(EditorInfo outAttrs) {

            inputConnection.setTarget(super.onCreateInputConnection(outAttrs));

            return inputConnection;

        }

        public void setBackSpaceLisetener(TInputConnection.BackspaceListener backSpaceLisetener) {

            inputConnection.setBackspaceListener(backSpaceLisetener);

        }

    }

    使用

    xml文件

    <?xml version="1.0"encoding="utf-8"?>

    调用class 文件(简单说如 事件分发 return true处理当前退格事件,被用户消耗;return false不处理当前退格事件,交给系统)

    TEditText identify1;privatevoidinit(){      identify1 = findViewById(R.id.identify1);      identify1.setBackSpaceLisetener(backspaceListener); }  TInputConnection.BackspaceListener backspaceListener = () -> {if(currentFocusEdit !=null&& TextUtils.isEmpty(currentFocusEdit.getText().toString())) {//当前获取焦点的 editText不为空 按返回使上一个框获取焦点intindexEdit = -1;for(inti =0; i < editTexts.size(); i++) {if(i >0&& editTexts.get(i).equals(currentFocusEdit)) {                    indexEdit = i;break;                }            }if(indexEdit != -1) {//找到了需要获取焦点的按钮for(inti =0; i < editTexts.size(); i++) {                    TEditText tEditText = editTexts.get(i);if(indexEdit == i) {//当前退格失去焦点loseFocusable(tEditText,false);                    }if(indexEdit -1== i) {//退格后获得焦点if(currentCode.size() !=0)                            currentCode.remove(currentCode.size() -1);                        tEditText.setText("");                        loseFocusable(tEditText,true);                    }                }returntrue;//表示处理当前退格事件}        }returnfalse;//不处理当前退格};

    相关文章

      网友评论

          本文标题:android监听软键盘退格(删除)事件

          本文链接:https://www.haomeiwen.com/subject/acyktktx.html