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