2012-04-27 84 views
79

我正在開發一個應用程序,當按下按鈕時,它會打開一個對話框,其中包含確定和取消按鈕。如何在對話框中處理後退按鈕?

它工作正常。

當用戶按下後退按鈕,我處理這個如下

public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 

    } 
return super.onKeyDown(keyCode, event); 
} 

但是上述方法沒有被調用。我該如何處理?

+1

你希望用戶能夠取消對話框?或者你的onKeyDown部分做什麼? – Krueger 2012-04-27 06:50:30

+0

@kiran ::你可以更清楚一點嗎? – KMI 2012-04-27 06:51:13

回答

187
dialog.setOnKeyListener(new Dialog.OnKeyListener() { 

      @Override 
      public boolean onKey(DialogInterface arg0, int keyCode, 
        KeyEvent event) { 
       // TODO Auto-generated method stub 
       if (keyCode == KeyEvent.KEYCODE_BACK) { 
        finish(); 
        dialog.dismiss(); 
       } 
       return true; 
      } 
     }); 
+7

不需要關閉'Dialog'; 'finish()'已經處理完了。另外,這個方法probaly應該返回'false'以便能夠捕獲其他地方的關鍵事件 – slinden77 2013-05-25 07:49:29

+5

我認爲alexc的答案在下面是一個更好的選擇。 – 2013-09-24 13:25:15

+0

試試並選擇首選 – 2013-10-03 18:24:54

4

試試這個

new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() { 

         @Override 
         public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 

          if(keyCode == KeyEvent.KEYCODE_BACK){ 
           Logger.d(TAG, "--------- Do Something -----------"); 
           return true; 
          } 
          return false; 


         } 
        }) 
+0

標記答案,如果有用! – NitZRobotKoder 2012-04-27 06:52:29

+0

不適合我.. – 2012-08-17 20:00:19

+1

爲什麼我不能在Builder中使用setOnCancelListener? – ffleandro 2012-11-06 15:03:22

1

那是因爲你的對話框打開時那麼你的窗口瀏覽其聚焦到對話框。 所以現在你必須在你的Dialog上處理key

+0

雖然正確,但這個答案並沒有提供有關如何處理對話框中的'key'的信息。 – 2013-09-24 13:26:34

19

您需要覆蓋OnCancel方法。此方法調用Back Key按鈕。這裏是完美的代碼。

AlertDialog alertDialog; 

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {     
      @Override 
      public void onCancel(DialogInterface dialog) 
      { 
       // TODO Auto-generated method stub 

        dialog.dismiss();       

      } 
}); 

希望這會幫助你,並接受它,如果它對你有幫助。

謝謝..

89

聽起來好像要在創建對話框設置OnCancelListener。它看起來像這樣:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {   
    @Override 
    public void onCancel(DialogInterface dialog) { 
     //do whatever you want the back key to do 
    } 
}); 
+6

這絕對是最好的答案。很好很簡單。無需檢測KeyEvent。完善。 – LargeGlasses 2015-03-09 16:06:00

+2

我知道我太遲了,但是想到指向某事。當用戶在對話框之外的某處點擊時,這另外也會被觸發。所以,如果你只需要覆蓋後退按鈕選項,那麼這不是你想要的。 – user2520215 2015-06-05 10:04:10

+3

@ user2520215如果您不希望在用戶單擊對話框外部時觸發它,則應該設置dialog.setCanceledOnTouchOutside(false)。這絕對是更好的答案。 – 2015-11-02 09:55:50