这是我的代码:
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模拟器)时,事件未激活。
我错过了什么?
答案 0 :(得分:17)
返回true
不是问题。
您失败了,因为您必须将听众设置为View
,而不仅仅是Activity
。
以澄清:
监听器的返回值并不意味着被理解为将要或不会被调用的信号。它无论如何都不可能,因为return
子句在显示后才会被称为。
这是系统发出需要进一步操作的信号(返回Toast
),或者该方法完全正确地处理了事件(返回false
)。这就是documentation用这些话说的原因:
<强>返回强>
如果听众有 消费 该事件,则为真,否则为false。
之间有区别:
true
课程中实施View.OnKeyListener
interface
。这允许您的Activity
实现您班级中界面提供的功能,即声明到您的Activity
知道如何处理该类型的世界事件。
请注意我说“声明”的事实。仅仅因为你声明你知道如何处理任务并不意味着人们会把这个任务交给你,也不意味着你可以自己生成这样的任务。在我看来,这是Activity
关键字的一个很好的比喻。这里implements
“要求执行任务”。
除了隐喻之外,从技术上讲,Activity
定义了一种处理该事件的方法,但它本身无法生成这种事件。
Activity
回调设置为View
实施使用它,Activity
绑定到一个监听器(恰好是你的View
),承诺在事件发生时通知它。
它与您的Activity
“签约”以接收输入(用户在Activity
处于焦点时按下ENTER键)并通知View
。由于Activity
之前声明它能够执行此操作, BOTH 各方可以按照之前约定执行合同(参见上一项)。
再次隐喻,从技术上讲,Activity
已在Activity
注册,以便在View
触发事件时稍后通知。 View
声明如何,但Activity
在时知道。
<强>结论:强>
这只是View
的隐喻(至少在这种情况下)。它可能看起来很复杂,但当你把它看成是一个双方协议时,它就很清楚了。如果您需要更好的技术说明,我建议您阅读interface
s。
回答新评论问题:
David大卫和其他所有人。真的我不能设置整个Activity的监听器吗?
不是那样的。您需要覆盖interface
。一个例子:
dispatchKeyEvent
答案 1 :(得分:10)
试试这个:
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;
}
修改强> David是正确的!!
返回true不是问题。
您失败了,因为您必须将侦听器设置为View,而不仅仅是Activity。