在EditText上键入两次onKey

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

当用户点击回车键(他们的电脑在使用模拟器时input密钥,或者硬件在硬件键盘上input密钥)时,onKey处理程序会执行两次。 两个执行都有keyCode 66。

为什么发生这种情况?

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

我的方法如下所示:

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

Solutions Collecting From Web of "在EditText上键入两次onKey"

AHHHH

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

 if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) { 

尝试这个:

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

你可以像这样过滤:

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

同样,当你用KeyEvent.ACTION_DOWN推键时

我有同样的问题,上面的答案帮助我,但我使用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; } } 

这样,DoSomething()只会被命名为只能按Enter键(Up),因此会被触发一次。 在Xamarin.Android上运行并testing

此事件由KeyEvent.ACTION_DOWNKeyEvent.ACTION_UP触发。 我做了debugging,最后我意识到有一个名为KeyEvent event的参数,我从来没有使用,然后我检查,发现问题。