2010-03-17 164 views
29

我有一個包含多個用戶可編輯項目(EditText字段,RatingBar等)的活動。我想提示用戶是否按下了後退/主頁按鈕,並且已經做出了尚未保存的更改。在閱讀完android文檔後,看起來這段代碼應該放在onPause方法中。我試圖把一個AlertDialog然而,在對話框中被顯示的的onPause,然後立即眼淚就下來了,因爲無所不有,從完成阻止暫停。Android:按下「後退」按鈕時提示用戶保存更改

這是我想出迄今:

@Override 
protected void onPause() { 
    super.onPause(); 

    AlertDialog ad = new AlertDialog.Builder(this).setMessage(
      R.string.rating_exit_message).setTitle(
      R.string.rating_exit_title).setCancelable(false) 
      .setPositiveButton(android.R.string.ok, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
           int whichButton) { 
          // User selects OK, save changes to db 
         } 
        }).setNeutralButton(android.R.string.cancel, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, 
           int whichButton) { 
          // User selects Cancel, discard all changes 
         } 
        }).show(); 
} 

我在正確的軌道上或有另一種方式來完成我想在這裏做什麼?任何幫助將是偉大的!

回答

95

你不太在正確的軌道;什麼,你應該做的是覆蓋onKeyDown()並監聽返回鍵,然後覆蓋默認的行爲:如果你只支持Android 2.0的和更高的

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
     // do something on back. 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

,他們已經增加了一個onBackPressed()您可以改用:

@Override 
public void onBackPressed() { 
    // do something on back. 
    return; 
} 

這個答案本質上是從this blog post中撕下來的。讀它,如果你需要印刷機,兼容性支持,虛擬硬盤鍵,或解決方案,如onPreIme()

+0

使用的onkeydown()方法將具有的onPause()相同的問題。如果我試圖表明在的onkeydown塊一個警告對話框,當我發現的返回鍵碼的對話框仍然不會阻止。我會立即看到警報,直到按下super.onKeyDown,這會導致窗口關閉。有沒有辦法在繼續之前強制對AlertDialog做出響應? – chriskopec 2010-03-17 17:04:24

+0

你打電話super.onKeyDown()如果你消耗後退按鈕?我假設你應該只是使用「返回true」,如果你彈出打開對話框,爲了向系統表明你已經消耗了後退按鈕;否則,通過調用super(),您仍然會結束調用完成活動的所有內容。 – 2010-03-17 17:16:53

+0

就是這樣,謝謝! – chriskopec 2010-03-17 21:33:30

10

你覺得這種做法有什麼支持..

private void exit(){ 
    this.finish(); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

     AlertDialog.Builder alertbox = new AlertDialog.Builder(this); 
     alertbox.setTitle("Message"); 
     alertbox.setMessage("Quit ??? "); 

     alertbox.setPositiveButton("Yes", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
         exit(); 
        } 
       }); 

     alertbox.setNeutralButton("No", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface arg0, int arg1) { 
        } 
       }); 

     alertbox.show(); 

     return true; 
    } else { 
     return super.onKeyDown(keyCode, event); 
    } 

} 
0

我做的,你做同樣的事情。我有一個客戶信息(EditText上的姓,名,電子郵件,......,你知道,到處的EditText),我用的AsyncTask的一個活動,它奇妙的作品。

@Override 
public void onBackPressed() 
{ 
      // start async task for save changes. 
    new GuardandoContactoHilo().execute() 
} 

public void VolverAtras() 
{ 
    super.onBackPressed(); 
} 

public class GuardandoContactoHilo extends AsyncTask< Void, Void, Void> 
{ 

    private ProgressDialog saving; 


    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     saving = new ProgressDialog(cont); 

     saving.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     saving.setMessage("Saving customer ..."); 
     saving.show(); 
    } 

    @Override 
    protected void onPostExecute(Void result) 
    { 
     super.onPostExecute(result); 
     saving.dismiss(); 
     VolverAtras(); // go back !! 
    } 

    @Override 
    synchronized protected Void doInBackground(Void... arg0) 
    { 

     // do what you want to do before come back ! for example, save data ;) 
     return null; 
    } 

} 
2

下面是一些示例代碼:

@Override 
public void onBackPressed() {  
    if (isDirty) {   
     new AlertDialog.Builder(this) 
      .setTitle("You have made some changes.") 
      .setMessage("Would you like to save before exiting?") 
      //.setNegativeButton(android.R.string.no, null)    
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface arg0, int arg1) { 
        MyActivity.super.onBackPressed(); 
       } 
      })    
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface arg0, int arg1) {      
        if (Save()) 
         MyActivity.super.onBackPressed(); 
       } 
      }).create().show(); 
    } 
    else { 
     MyActivity.super.onBackPressed(); 
    } 
}