2010-03-17 112 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(); 
    } 
}