3

我有一段代码:

passwordEditText.setOnKeyListener(new OnKeyListener() 
    {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) 
        {
            if (keyCode == KeyEvent.KEYCODE_ENTER)
            {
                launch.performClick();
                return true;

            }
            else
            {
                return false;
            }
        }
    });

我想要的是,当按下回车键时,它会执行登录命令(启动是执行登录的按钮)。但是,在执行 true 块之后,它还会继续执行 else 块,返回 false 并导致(仅在某些设备上)第二次登录。

所以我的问题分为两部分:if else 语句如何评估为真和假,以及我怎样才能使它不这样做。我已经想到了一些技巧来实现这一点,但这似乎是一个更好地理解然后快速修补的问题。

4

5 回答 5

9

你看到的是 OnKey 被触发了两次,第一次是按键,第二次是按键,所以你必须过滤它

    if (event.getAction()!=KeyEvent.ACTION_DOWN) {
        return true;
    }

    switch (keyCode) {
       case KeyEvent.KEYCODE_1 : 
            //do something
            break;
       case KeyEvent.KEYCODE_2 : 
            //do something
            break;
       case KeyEvent.KEYCODE_3 : 
            //do something
            break;
    }

    return true;
于 2011-09-09T19:12:57.907 回答
1

当条件结果只导致返回语句时,调试器可能会产生误导。放入一个无用的'int x变量'并让它在返回true之前分配x = 2(比如说),在返回false之前分配x = 3(比如说)。在调试器中再次单步执行,我敢打赌你会看到它只进入其中一个块

于 2011-09-09T19:20:10.167 回答
1

尝试使用此代码...

密码EditText.setOnKeyListener(新的OnKeyListener(){

    public boolean onKey(View v, int keyCode, KeyEvent event) 
    {
        if (keyCode == KeyEvent.KEYCODE_ENTER)
        {
            launch.performClick();
            return true;

        }
        return false;

    }
});
于 2011-09-13T04:35:14.787 回答
0

你描述的不可能。您发布的代码看起来是正确的,所以我想知道您发布的代码段中是否存在错误。

也就是说,一些编码错误可能导致程序员相信“if”和“else”块都在执行。例如

if(condition) {
  // do something
}
else; // note the semicolon here
{
  // do something else
  // this gets executed regardless of whether the condition is true!
}

但即便如此,如果你的“if”块中有一个“return”,你也无法进入第二个块:)

于 2011-09-09T19:09:10.547 回答
0

按下(或按住或释放)一个键时会触发多个事件。

专门针对新闻发布,将触发以下内容:

ACTION_DOWN

ACTION_DOWN(如果持有,repeatCount 非零,事件可能重复多次)

ACTION_UP(如果事件被取消,可能会设置 FLAG_CANCELED)

您的代码不会检查 action 属性,因此每次发送涉及回车键的事件时都会运行该代码。

代替

if (keyCode == KeyEvent.KEYCODE_ENTER)

if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP)

如果您只想在释放键时触发一次。检查 ACTION_DOWN 需要额外的过滤以避免由于重复键而导致的多次火灾。当 ACTION_UP 发生时,您可能还想检查 FLAG_CANCELED 的状态。

于 2011-09-09T19:19:43.237 回答