2011-09-09 25 views
2

我有一个代码块:为什么执行if else语句的两边,以及如何解决它?

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

我要的是,当输入键被按下它执行日志中的命令(发射的是,在执行日志的按钮)。但是,执行完真块后,它将继续执行else块,并返回false并导致(仅在某些设备上)第二次登录。

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

+1

此外,如果我扭转它,这样它的keyCode!= KeyEvent.KEYCODE_ENTER它关系到正确的块(else块),但是它运行两次反正! – Pyrodante

+1

你是否尝试过对这个事件处理函数进行日志方法调用?看起来它是在按下Enter之后处理另一个事件的,一个else语句不会被评估为true和false,任何编译器都不会有这样一个奇怪的错误,所以你需要假设这不是导致你的问题的原因 – rsalmeidafl

+0

它的一个关键的下一个和一个关键的双重火灾 – JPM

回答

9

你们看到的是安其被解雇两次,第一次为重点下来,关键了第二次,所以你必须与时按下某个键(或持有,或释放)

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; 
+0

完全是这样。我知道有些东西不见了! – Pyrodante

+0

如果(event.getFlags()&KeyEvent.FLAG_CANCELED!= 0){//事件被取消},您还应该检查是否未设置FLAG_CANCELED} – Mark

+0

@Mark yes您需要检查是否正确。另外我看到一些问题,只是使用onKeyDown它不会被解雇的一些奇怪的原因,所以坚持onKey事件 – JPM

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! 
} 

但即便如此,如果你有你的“如果”块“回报”,有没有办法,你可以得到第二块:)

+0

代码被逐字复制并粘贴到程序中,我一次一行地以调试模式行进,并观察发生了什么。 – Pyrodante

+0

那么,在“if”块中“返回true”之后会发生什么? – Macondo2Seattle

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的状态。

1

当条件结果导致返回语句时,调试器可能会引起误解。放入一个无用的'int x变量',并让它在return true之前赋值x = 2(比如说),在返回false之前赋值x = 3(比如说)。通过再次在调试一步,我敢打赌,你看到它进入只有块

1

尝试与此代码的一个...

passwordEditText。setOnKeyListener(新OnKeyListener(){

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

     } 
     return false; 

    } 
});