Android:按下“后退”button时,提示用户保存更改

我有一个包含多个用户可编辑项目(EditText字段,RatingBar等)的活动。 我想提示用户是否按下了返回/主页button,并且已经做出了尚未保存的更改。 阅读完Android文档后,看起来这段代码应该放在onPause方法中。 我已经尝试在onPause中放置一个AlertDialog,然而对话框显示,然后立即下降,因为没有什么是阻止暂停完成。

这是我到目前为止:

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

我在正确的轨道上还是有另一种方法来完成我在这里要做的事情? 任何帮助将是伟大的!

你不是在正确的轨道上, 你应该做的是重写onKeyDown()并监听返回键,然后覆盖默认行为:

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

如果您只支持Android 2.0及更高版本, onBackPressed()添加一个onBackPressed()您可以使用它:

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

这个答案本质上是从这个博客文章中撕下来的 。 如果您需要按, 兼容性支持, 虚拟硬键支持或onPreIme()原始解决scheme,请阅读它。

你怎么看待这个方法?

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

这是一些示例代码:

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

我正在做和你一样的事情。 我有一个活动与客户信息(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; } }