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

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

我错过了什么?

4

2 回答 2

19

回归true不是问题。

您失败了,因为您必须将侦听器设置为 a View,而不仅仅是Activity.

为澄清而编辑:

侦听器的返回值并不意味着被理解为事件将被调用或不会被调用的信号。无论如何它不能,因为该return子句仅在您显示后才Toast被调用。

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

退货

如果侦听器已经消费了事件,则为 true,否则为 false。


两者之间有区别:

  • View.OnKeyListener interface在你的Activity课堂上实施。

这允许您Activity在您的类中实现接口提供的功能,即向世界声明您知道Activity如何处理此类事件。

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

除了隐喻,从技术上讲,它Activity正在定义一种处理该事件的方法,但它本身不能生成那种事件。

  • View回调设置为您的Activity实现

使用它, aView绑定到一个侦听器(恰好是你的Activity),承诺在事件发生时通知它。

它与您“签订合同”Activity以接收输入(用户View在焦点对准时按下 ENTER 键)并通知Activity. 并且由于Activity先前声明它能够执行该操作,因此双方都可以按照先前的约定执行合同(参见上一项)。

再次抛开比喻,从技术上讲,这里Activity是由 注册的,View以便稍后在View触发事件时得到通知。Activity声明如何,但View知道何时

结论:

这只是interfaces 的一个隐喻(至少在这种情况下)。它可能看起来很复杂,但是当您将其视为两方协议时,它就非常清楚了。如果您需要更好的技术解释,我建议您阅读有关interfaces.


回答新的评论问题:

你好大卫和其他人。真的我不能为整个活动设置一个监听器吗?

不是那样的。您需要覆盖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);
};
于 2012-06-28T03:55:27.977 回答
11

尝试这个:

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 不是问题。

您失败了,因为您必须将侦听器设置为视图,而不仅仅是活动。

于 2012-06-28T03:45:05.223 回答