为什么if else语句的双方都被执行,以及如何修复它?

时间:2011-09-09 19:03:40

标签: android if-statement keyevent

我有一段代码:

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语句如何评估为true和false,以及如何实现它以便它不会这样做。我想到了一些技巧可以实现这一点,但这似乎是一个更好理解然后快速修补的问题。

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

答案 2 :(得分:1)

尝试使用此代码...

passwordEditText.setOnKeyListener(new OnKeyListener()     {

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

        }
        return false;

    }
});

答案 3 :(得分:0)

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

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

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

但是即便如此,如果你的“if”区块中有“返回”,那么你无法进入第二个区块:)

答案 4 :(得分:0)

按下(或保持或释放)某个键时会触发多个事件。

特别是对于按下和释放,会触发以下内容:

ACTION_DOWN

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

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

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

替换

if (keyCode == KeyEvent.KEYCODE_ENTER)

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

如果您只想在解锁密钥时触发一次。检查ACTION_DOWN需要额外的过滤以避免因重复键而发生多次火灾。您可能还想在ACTION_UP发生时检查FLAG_CANCELED的状态。