在Android中收听ENTER键

Car*_*ira 9 android enter keylistener

这是我的代码:

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

dav*_*ino 18

回归true不是问题.

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

编辑澄清:

监听器的返回值并不意味着被理解为将要或不会被调用事件的信号.而且它不能无论如何,因为该return条款只调用您的Toast显示.

这是系统发出需要进一步操作(返回false)的信号,或者该方法完全正确地处理事件(返回true).这就是文档用这些话说的原因:

返回

如果侦听器已使用该事件,则为true,否则为false.


有以下区别:

  • View.OnKeyListener interface在你的Activity班级实施.

这允许您Activity实现类中接口提供的功能,即向世界宣告Activity知道如何处理该类事件.

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

除了隐喻之外,从技术上讲,Activity它定义了一种处理该事件的方法,但它本身不能产生这种事件.

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

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

它与你"收缩" Activity以接收输入(用户View在焦点时按下ENTER键)并通知Activity.而且,由于Activity先前宣布,它能够执行的BOTH如先前商定各方能够履行合同(参见上文).

再次抛开隐喻,从技术上讲,这里Activity注册的View是在View触发事件时稍后通知.该Activity声明如何,但View知道的时候.

结论:

这只是interfaces的一个比喻(至少在这种情况下).它可能看起来很复杂,但当你把它看成是一个双方协议时,它就很清楚了.如果你需要一个更好的,技术性的解释,我建议阅读interfaces.


回答新的评论问题:

你好大卫和其他人.真的我不能设置整个Activity的监听器吗?

不是那样的.你需要覆盖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);
};
Run Code Online (Sandbox Code Playgroud)


Yaq*_*mad 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; 
    }
Run Code Online (Sandbox Code Playgroud)

编辑: 大卫是正确的!

返回真实不是问题.

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