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();
}
Я нахожусь на правильном пути или есть другой способ выполнить то, что я пытаюсь сделать здесь? Любая помощь будет замечательной!
Ответы
Ответ 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;
}
Этот ответ по существу разорван из этого сообщения в блоге. Прочтите его, если вам нужны длинные прессы, совместимость, поддержка виртуальных жестких ключей или raw a href= "https://stackoverflow.com/a/6707333/632951" > onPreIme()
и т.д.
Ответ 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;
}
}