我已将OnKeyListener附加到EditText。 我已经覆盖了onKey处理程序以捕获KeyEvent。
当用户按下回车键(使用仿真器时其计算机的回车键,或电话上带有硬件键盘的硬件的回车键)时,onKey处理程序将执行两次。 这两个执行都具有keyCode 66。
为什么会这样呢?
我想要我的屏幕,以便当用户按下Enter键时,将执行搜索。 由于发生了什么,搜索不必要地进行了两次。
我的方法如下所示:
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;
}
});
AHHHH
我认为这是向上和向下键发生的吗?
大概。 检查KeyEvent,而不仅仅是代码。 Ive历史上发现HTC键盘有时会引发多个事件(有时用户会反复打滑并多次按" Enter"键),因此您可能希望将实例变量保留在侦听器中以仅跟踪何时执行操作 已被射击,因此您可以防止意外第二次射击。
好主意。 我认为,当搜索任务启动时,我会用几秒钟的计时器启动另一个任务,直到该线程结束,用户将无法再次按下Enter键。
不应将此答案标记为答案,请将以下(更有用的)答案之一标记为答案(Id建议Abduls)。 谢谢。
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;
}
}
这样,仅在按下Enter键(向上)时才调用DoSomething(),因此将被触发一次。 在Xamarin.Android上工作并经过测试
我调试了,对我有用的是
editText.setOnKeyListener(View.OnKeyListener { view, i, keyEvent ->
if (i == KeyEvent.KEYCODE_ENTER && enterAsSend && (keyEvent.action == KeyEvent.ACTION_UP || keyEvent.action == KeyEvent.ACTION_DOWN)) {
//Do stuff
}
return@OnKeyListener true
}
false
})
并为您的Editext检出android:inputType="textNoSuggestions",因为单击Enter键会给我们字典中的建议。
KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP引发此事件。
我已经完成调试,最后我意识到我从未使用过一个名为KeyEvent event的参数,然后检查并发现了问题。