Android

Android: Prompt user to save changes when Back button is pressed

Android: запрашивает у пользователя сохранение изменений при нажатии кнопки "Назад"

У меня есть действие, которое содержит несколько редактируемых пользователем элементов (поле EditText, панель рейтинга и т.д.). Я хотел бы запросить у пользователя, нажата ли кнопка "Назад" / "Домой" и были ли внесены изменения, которые еще не были сохранены. После прочтения документации Android кажется, что этот фрагмент кода должен выполняться методом 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();
}

Я на правильном пути или есть другой способ выполнить то, что я пытаюсь здесь сделать? Любая помощь была бы отличной!

Переведено автоматически
Ответ 1

Вы не совсем на правильном пути; что вам следует сделать, так это переопределить 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() etc.

Ответ 2

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

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

}
Ответ 3

Вот несколько примеров кода:

@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();
}
}
Ответ 4

Я делаю то же самое, что и вы. У меня есть одно действие с информацией о клиенте (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;
}

}
java android