Android: Prompt user to save changes when Back button is pressed
Android: запрашивает у пользователя сохранение изменений при нажатии кнопки "Назад"
У меня есть действие, которое содержит несколько редактируемых пользователем элементов (поле EditText, панель рейтинга и т.д.). Я хотел бы запросить у пользователя, нажата ли кнопка "Назад" / "Домой" и были ли внесены изменения, которые еще не были сохранены. После прочтения документации Android кажется, что этот фрагмент кода должен выполняться методом onPause. Я попытался ввести AlertDialog в onPause, однако диалоговое окно отображается, а затем сразу же отключается, потому что там нет ничего, что могло бы заблокировать завершение паузы.
AlertDialogad=newAlertDialog.Builder(this).setMessage( R.string.rating_exit_message).setTitle( R.string.rating_exit_title).setCancelable(false) .setPositiveButton(android.R.string.ok, newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface dialog, int whichButton) { // User selects OK, save changes to db } }).setNeutralButton(android.R.string.cancel, newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface dialog, int whichButton) { // User selects Cancel, discard all changes } }).show(); }
Я на правильном пути или есть другой способ выполнить то, что я пытаюсь здесь сделать? Любая помощь была бы отличной!
Переведено автоматически
Ответ 1
Вы не совсем на правильном пути; что вам следует сделать, так это переопределить onKeyDown() и прослушать клавишу "Назад", а затем переопределить поведение по умолчанию:
@Override publicbooleanonKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // do something on back. returntrue; }
returnsuper.onKeyDown(keyCode, event); }
Если вы поддерживаете только Android 2.0 и выше, они добавили onBackPressed(), который вы можете использовать вместо:
@Override publicvoidonBackPressed() { // do something on back. return; }
Этот ответ, по сути, взят из этого сообщения в блоге. Прочтите это, если вам нужны долгие нажатия, поддержка совместимости, поддержка виртуальных жестких клавиш или необработанных решений, таких как onPreIme() etc.
@Override publicvoidonBackPressed() { if (isDirty) { newAlertDialog.Builder(this) .setTitle("You have made some changes.") .setMessage("Would you like to save before exiting?") //.setNegativeButton(android.R.string.no, null) .setNegativeButton("No", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface arg0, int arg1) { MyActivity.super.onBackPressed(); } }) .setPositiveButton("Yes", newDialogInterface.OnClickListener() { publicvoidonClick(DialogInterface arg0, int arg1) { if (Save()) MyActivity.super.onBackPressed(); } }).create().show(); } else { MyActivity.super.onBackPressed(); } }
Ответ 4
Я делаю то же самое, что и вы. У меня есть одно действие с информацией о клиенте (EditText для имени, фамилии, электронной почты, ..., вы знаете, EditText везде), и я использовал AsyncTask для этого, и это работает чудесно.
@Override publicvoidonBackPressed() { // start async task for save changes. newGuardandoContactoHilo().execute() }