在Android中收听输入键
这是我的密码:在Android中收听输入键,android,keylistener,enter,Android,Keylistener,Enter,这是我的密码: public class CaptureENTER extends Activity implements OnKeyListener{ /* on create and other stuff in here*/ @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if ((event.getAction() == KeyEvent.ACTION_DOWN
public class CaptureENTER extends Activity implements OnKeyListener{
/* on create and other stuff in here*/
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
Toast.makeText(LiVoiceActivity.this,
"YOU CLICKED ENTER KEY",
Toast.LENGTH_LONG).show();
}
return false;
}
我不知道发生了什么,但当我按下键盘上的ENTER键(我使用的是Android emulator)时,事件未被激活
我缺少什么?试试这个:
public class CaptureENTER extends Activity implements OnKeyListener{
/* on create and other stuff in here*/
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
(keyCode == KeyEvent.KEYCODE_ENTER)) {
Toast.makeText(LiVoiceActivity.this,
"YOU CLICKED ENTER KEY",
Toast.LENGTH_LONG).show();
return true;
}
return false;
}
编辑:
这是正确的
返回true不是问题所在
您之所以失败,是因为您必须将侦听器设置为视图,而不仅仅是活动。返回
true
不是问题所在
您失败是因为必须将侦听器设置为视图
,而不仅仅是活动
为澄清而编辑:
侦听器的返回值不应理解为事件将被调用或不被调用的信号。无论如何它也不能,因为只有在显示Toast
之后才会调用return
子句
这是一个向系统发出的信号,表明需要采取进一步的行动(返回false
),或者该方法完全正确地处理了事件(返回true
)。这就是为什么政府会这样说:
返回
如果侦听器已消费了事件,则为True,否则为false
这两者之间有区别:
- 在
类中实现活动
视图.OnKeyListener
接口
活动
实现类中接口提供的功能,即向世界宣布您的活动
知道如何处理此类事件
请注意我说的“申报”。仅仅因为你声明你知道如何处理任务并不意味着人们会把任务交给你,也不意味着你可以自己生成这样的任务。在我看来,这是对implements
关键字的一个很好的比喻。此处的活动
“请求任务”
撇开隐喻不谈,从技术上讲,活动定义了一种处理该事件的方法,但它本身无法生成此类事件。
- 将
回调设置为视图
实现活动
视图
绑定到侦听器(这恰好是您的活动
),承诺在事件发生时通知它
它与您的活动
“收缩”以接收输入(当视图处于焦点时,用户按ENTER键),并通知活动
。由于活动
先前声明其有能力履行该义务,双方可以按照先前约定的方式执行合同(见上一项)
从技术上讲,这里的活动由视图
注册,稍后当视图
触发事件时会收到通知。活动
声明如何执行,但视图知道何时执行。
结论:
这只是接口
s的隐喻(至少在本例中是这样)。它可能看起来很复杂,但当你把它看作是一个双方协议时,它是非常清楚的。如果您需要更好的技术性解释,我建议您阅读interface
s
对新评论问题的回答:
大卫和大家好。我真的不能为整个活动设置一个侦听器吗
不是那样的。您需要覆盖dispatchKeyEvent
。例如:
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
Toast.makeText(UITestsActivity.this,
"YOU CLICKED ENTER KEY",
Toast.LENGTH_LONG).show();
return true;
}
return super.dispatchKeyEvent(e);
};
啊,当然,它必须是一个重点。。。否则,我们在非接触模式下如何区分视图。。。我相信你一定注意到了,对吧?对吧?;-)大卫和大家好。我真的不能为整个活动设置一个听众吗?我用这个新问题的答案更新了我的答案。简言之:你可以,但不是以你正在尝试的方式。