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模拟器)时,事件未激活.
我错过了什么?
解决方法
您失败了,因为您必须将侦听器设置为View,而不仅仅是Activity.
编辑澄清:
监听器的返回值并不意味着被理解为将要或不会被调用事件的信号.它无论如何都不可能,因为只有在显示Toast之后才会调用return子句.
这是系统发出需要进一步操作(返回false)的信号,或者该方法完全正确地处理事件(返回true).这就是documentation用这些话说的原因:
Returns
True if the listener has consumed the event,false otherwise.
两者之间有区别:
>在Activity类中实现View.OnKeyListener接口.
这允许您的Activity实现类中接口提供的功能,即向世界声明您的Activity知道如何处理该类事件.
请注意我说“申报”的事实.仅仅因为你声明你知道如何处理任务并不意味着人们会把这个任务交给你,也不意味着你可以自己生成这样的任务.在我看来,这是implements关键字的一个很好的比喻.这里活动“要求任务”.
除了隐喻之外,从技术上讲,Activity定义了一种处理该事件的方法,但它本身不能生成这种事件.
>将View回调设置为您的Activity实现
使用它,View绑定到一个监听器(恰好是你的Activity),承诺在事件发生时通知它.
它与您的Activity“收缩”以接收输入(用户在View处于焦点时按下ENTER键)并通知Activity.而且由于活动之前宣布它能够执行该活动,因此双方可以按照先前的约定执行合同(参见前一项).
再次隐喻,此处活动由View注册,以便稍后在View触发事件时通知. Activity声明如何,但View知道何时.
结论:
这只是接口的隐喻(至少在这种情况下).它可能看起来很复杂,但当你把它看成是一个双方协议时,它就很清楚了.如果您需要更好的技术解释,我建议阅读有关接口的内容.
回答新的评论问题:
Hello David and everyone else. Really I can’t set a listener to the whole Activity?
不是那样的.您需要覆盖dispatchKeyEvent.一个例子:
@Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) { Toast.makeText(UITestsActivity.this,Toast.LENGTH_LONG).show(); return true; } return super.dispatchKeyEvent(e); };