2011-09-09 66 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; 

    } 
});