【问题标题】:Android - catch backspace (delete) button on custom EditTextAndroid - 在自定义 EditText 上捕获退格(删除)按钮
【发布时间】:2016-01-03 17:26:17
【问题描述】:

我想在EditText custom 上捕捉软键盘中的退格/删除按钮事件。

我该怎么做?

我尝试了这些解决方案,但它们对我不起作用:

Android custom EditText and back button override

EditText OnKeyDown

Get back key event on EditText

Android EditText delete(backspace) key event

感谢您的帮助!


编辑: 我使用 DispatchKeyEvent 函数找到了解决该问题的方法:

@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN
        && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
     // ... 
    }
    return super.dispatchKeyEvent(event);
}

【问题讨论】:

  • “不工作”是什么意思?你在哪里测试?在模拟器还是在设备上?
  • 当我按下软键盘上的任何按钮时,函数中的代码没有被执行(在所有条件之外)。我用我的设备(三星 Galaxy S5)进行了测试。
  • 检查KeyEvent class 的文档,它指出捕获软输入是不可靠的。在 Activity 类中覆盖 onBackPressed() 并在其中做你需要做的事情可能会更好。 编辑:当然,除非您的意思是“将光标向后移动一个空格”,而不是标准的后退导航键。
  • @PPartisan onBackPressed 在打开软输入时将无济于事
  • @PPartisan 我想要标准的后退按钮来删除我的编辑文本中的一个字符,但要符合我的规则

标签: android input android-edittext


【解决方案1】:

我使用 DispatchKeyEvent 函数找到了解决该问题的方法:

@Override public boolean dispatchKeyEvent(@NonNull KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN
        && event.getKeyCode() == KeyEvent.KEYCODE_DEL) {
        // ... 
    }
    return super.dispatchKeyEvent(event);
}

【讨论】:

  • 它仅适用于默认编辑文本,不适用于自定义编辑文本。
【解决方案2】:

在 Android 中从软输入法中捕获关键事件是不可靠的。以下是 KeyEvent 类的 JavaDoc 摘录:

因为软输入法可以使用多种创新的输入方式 文本,不能保证软键盘上的任何按键都会 生成一个关键事件:这由 IME 自行决定,并且在 事实上,不鼓励发送此类事件。你永远不应该依赖 接收软输入法上任何键的 KeyEvents。特别是, 默认的软件键盘永远不会向任何人发送任何按键事件 面向 Jelly Bean 或更高版本的应用程序,并且只会发送事件 对于某些应用程序的删除和返回键的按下 定位到冰淇淋三明治或更早。

一种解决方法可能涉及使用TextWatcher。每当在 EditText 中发生删除时,字符数就会下降。

myEditText.addTextChangedListener(this);
//...
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (count == 0) {
        //text was deleted. 
    }
}

编辑:这是未经测试的,因此可能并不完全可靠。另外,值得指出的是,count 也可以读成0,如果选择了很长一段文字然后替换。我曾经创建了一个库,旨在将撤消/重做功能添加到EditText,但也可以identify the difference between text being replaced and deleted,因此如果您需要更高的准确性,这可能对您有用。

【讨论】:

  • 非常感谢您的回答,但我用 dispatchKeyEvent 函数重试了,它成功了!
  • @nolimitee 好 :) - 可能值得回答您自己的问题,以防将来帮助其他人解决此问题
  • @nolimitee,请将解决方案作为答案发布,这将对其余部分有所帮助......
【解决方案3】:

请看一下我在另一个类似主题中提供的解决方案:Android - cannot capture backspace/delete press in soft. keyboard。您需要构建您的自定义 EditText 类并覆盖其中的 onCreateInputConnection 方法。它将使您可以访问deleteSurroundingText 事件,当您单击退格键时会触发该事件。我已经在一些设备上测试过它,希望它也能在其他设备上工作。试一试并提供反馈。

【讨论】:

    【解决方案4】:

    给你..

    editText.addTextChangedListener(new TextWatcher() {
    
                private int before;
                private int after;
                private int prevLength;
                private boolean isBackPressed;
                ArrayList<Integer> arrayList;
    
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    prevLength = charSequence.length();
                }
    
                @Override
                public void onTextChanged(CharSequence charSequence, int start, int end, int count) {
    
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
                    isBackPressed = prevLength > editable.length();
    
                    if(isBackPressed){
                        Toast.makeText(getApplicationContext(),"Back",Toast.LENGTH_LONG).show();
                    }
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      • 2011-06-20
      • 2018-10-31
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多