Android: подскажите пользователю сохранить изменения при нажатии кнопки «Назад»

У меня есть активность, которая содержит несколько редактируемых пользователем элементов (поле EditText, RatingBar и т. Д.). Я хотел бы вызвать пользователя, если нажата кнопка «Назад / Дом», и были внесены изменения, которые еще не были сохранены. После прочтения документации по андроиде, похоже, этот кусок кода должен идти в методе onPause. Я попытался помещать AlertDialog в onPause, но диалог отображается, а затем сразу же срывается, потому что ничего не происходит, чтобы заблокировать паузу.

Это то, что я придумал до сих пор:

@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() вы можете использовать вместо этого:

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

Этот ответ по существу разорван из этого сообщения в блоге . Прочтите его, если вам нужны длинные нажатия, поддержка совместимости , поддержка виртуальных жестких клавиш или исходные решения, такие как onPreIme() и т. Д.

Что вы думаете об этом подходе.

 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; } } 
  • Ошибка раздувания при расширении classа
  • Что такое Runtime.getRuntime (). TotalMemory () и freeMemory ()?
  • Как удалить только пробелы строки в Java и сохранить ведущие пробелы?
  • Драйвер JDBC PostgreSQL с Android
  • Путь к ресурсу в нашей папке war / WEB-INF?
  • Безопасная публикация HTTP на Android
  • Ввод пользователем петли до тех пор, пока не будут выполнены условия
  • Как создать classы Java из файла WSDL
  • Не удалось импортировать новый проект Gradle: не удалось найти версию Build Tools * .0.0
  • Как зарегистрировать некоторое пространство имен URL (myapp: //app.start/) для доступа к вашей программе, вызывая URL-адрес в браузере в ОС Android?
  • Можно ли объявить переменную в Gradle, используемой в Java?
  • Давайте будем гением компьютера.