在Android中听取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) && (keyCode == KeyEvent.KEYCODE_ENTER)) { Toast.makeText(LiVoiceActivity.this, "YOU CLICKED ENTER KEY", Toast.LENGTH_LONG).show(); } return false; } 

我不知道发生了什么,但是当我按下我的键盘上的ENTER键(我正在使用Android模拟器)时, 事件不会被激活

我错过了什么?

Solutions Collecting From Web of "在Android中听取ENTER键"

回到true不是问题。

你失败了,因为你必须设置监听器到一个View ,而不仅仅是Activity

编辑澄清:

监听器的返回值不能被理解为事件将被调用或不被调用的信号。 而且不可能,因为return语句只你的Toast被显示之后被调用。

这是系统需要进一步操作的信号(返回false ),或者方法完全正确地处理了事件(返回true )。 这就是为什么文档用这些话来说:

返回

如果侦听器消耗了该事件,则返回true,否则返回false。


之间有一个区别:

  • Activity类中实现View.OnKeyListener interface

这可以让你的Activity实现你的类中的接口提供的function,也就是向世界宣告你的Activity知道如何处理这种事件。

请注意我说“ 申报 ”的事实。 只是因为你宣称自己知道如何处理一项任务并不意味着人们会把这个任务交给你, 也不意味着你可以自己产生这样的任务 。 在我看来,这是implements关键字的一个很好的隐喻。 这里Activity “要求任务”。

在技​​术层面上,隐喻不在话下, Activity正在定义处理这个事件的方法,但是它本身不能产生这种事件。

  • Viewcallback设置为您的Activity实现

使用它,一个View绑定到一个监听器(碰巧是你的Activity ),承诺每当事件发生时通知它。

它与您的Activity “契约”以接收input(用户在View处于焦点时按下ENTER键)并通知Activity 。 而且由于该Activity先前声明它有能力履行这一点,所以双方可以按照先前的约定执行合同 (见前一条款)。

在技​​术上,再次隐藏了隐喻,这里ActivityView注册,以后当View触发事件时通知。 Activity声明如何 ,但View知道什么时候

结论:

这只是interface s的一个隐喻(至less在这种情况下)。 这可能看起来很复杂,但是当你把它看成是一个双方的协议时就很清楚了。 如果你需要一个更好的,技术性的解释,我build议阅读关于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); }; 

尝试这个:

 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; } 

编辑: 大卫是正确的!

回到真实不是问题。

你失败了,因为你必须设置监听器到一个视图,而不仅仅是活动。