在EditText上输入密钥,按两次onKey

And*_*rew 20 android

我已经将OnKeyListener附加到EditText.我已经覆盖onKey处理程序来捕获KeyEvent.

当用户点击回车键时(他们的计算机在使用模拟器时输入密钥,或硬件在硬件键盘上输入密钥),onKey处理程序将被执行两次.两个执行都有keyCode 66.

为什么会这样?

我想要我的屏幕,所以当用户点击回车键时,会执行搜索.由于发生了什么,搜索不必要地发生两次.

我的方法看起来像这样:

   mFilter.setOnKeyListener(new View.OnKeyListener() {

        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                // perform search
                return true;
            }
            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

And*_*rew 24

AHHHH

我认为这是关键和关键的发生吗?

  • 这不应该标记为答案,请在下面(更有用的)答案之一作为答案(我推荐阿卜杜勒).谢谢. (2认同)

小智 16

if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) {
Run Code Online (Sandbox Code Playgroud)

  • 只要用户按下它,就会生成"按键". (2认同)

小智 11

试试这个:

mFilter.setOnKeyListener(new View.OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                // perform search
                return true;
            }
        }
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)


Ale*_*xis 8

你可以像这样过滤:

object.setOnKeyListener(new OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                // do stuff
                return true;
            }

            return false;
        }
    });
Run Code Online (Sandbox Code Playgroud)

使用KeyEvent.ACTION_DOWN按下键时的同义词


Has*_*iar 5

我遇到了同样的问题,上面的答案对我有帮助,但我使用的是 Xamarin.Android (c#),所以它的语法略有不同。这是对我有用的:

MyStringTextBox.KeyPressed += OnEnterKeyPressed;

protected void OnEnterKeyPressed(object sender, View.KeyEventArgs e)
{
    if (e.KeyCode == Keycode.Enter && e.Event.Action == KeyEventActions.Up)
    {
        DoSomething(this, EventArgs.Empty);
    }
    else
    {
        e.Handled = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,DoSomething() 只会在按下 Enter 键 (Up) 时被调用,因此会被触发一次。在 Xamarin.Android 上工作和测试