Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中收听输入键_Android_Keylistener_Enter - Fatal编程技术网

在Android中收听输入键

在Android中收听输入键,android,keylistener,enter,Android,Keylistener,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

这是我的密码:

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 emulator)时,事件未被激活

我缺少什么?

试试这个:

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


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

返回
true
不是问题所在

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

为澄清而编辑:

侦听器的返回值不应理解为事件将被调用或不被调用的信号。无论如何它也不能,因为只有在显示
Toast
之后才会调用
return
子句

这是一个向系统发出的信号,表明需要采取进一步的行动(返回
false
),或者该方法完全正确地处理了事件(返回
true
)。这就是为什么政府会这样说:

返回

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


这两者之间有区别:

  • 活动
    类中实现
    视图.OnKeyListener
    接口
这允许您的
活动
实现类中接口提供的功能,即向世界宣布您的
活动
知道如何处理此类事件

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

撇开隐喻不谈,从技术上讲,
活动定义了一种处理该事件的方法,但它本身无法生成此类事件。

  • 视图
    回调设置为
    活动
    实现
使用它,
视图
绑定到侦听器(这恰好是您的
活动
),承诺在事件发生时通知它

它与您的
活动
“收缩”以接收输入(当
视图处于焦点时,用户按ENTER键),并通知
活动
。由于
活动
先前声明其有能力履行该义务,双方可以按照先前约定的方式执行合同(见上一项)

从技术上讲,这里的
活动由
视图
注册,稍后当
视图
触发事件时会收到通知。
活动
声明如何执行,但
视图知道何时执行。

结论:

这只是
接口
s的隐喻(至少在本例中是这样)。它可能看起来很复杂,但当你把它看作是一个双方协议时,它是非常清楚的。如果您需要更好的技术性解释,我建议您阅读
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);
};

啊,当然,它必须是一个重点。。。否则,我们在非接触模式下如何区分视图。。。我相信你一定注意到了,对吧?对吧?;-)大卫和大家好。我真的不能为整个活动设置一个听众吗?我用这个新问题的答案更新了我的答案。简言之:你可以,但不是以你正在尝试的方式。