我已将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;
}
});
答案 0 :(得分:23)
AHHHH
我认为这会发生在按键和按键状态下?
答案 1 :(得分:16)
if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction()==0) {
答案 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;
}
});
答案 3 :(得分:7)
你可以像这样过滤:
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 按下键时的idem
答案 4 :(得分:4)
我遇到了同样的问题,上面的答案对我有帮助,但我使用的是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上运行和测试
答案 5 :(得分:0)
此事件由KeyEvent.ACTION_DOWN
和KeyEvent.ACTION_UP
触发。
我已经完成了调试,最后我意识到有一个名为KeyEvent event
的参数我从未使用过,然后我检查并发现了问题。
答案 6 :(得分:0)
我调试了,对我有用的是
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键会给我们字典中的建议。