Android: предлагает пользователю сохранить изменения при нажатии кнопки «Назад». - PullRequest
32 голосов
/ 17 марта 2010

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

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

Ответы [ 4 ]

95 голосов
/ 17 марта 2010

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

11 голосов
/ 10 сентября 2011

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

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

}
2 голосов
/ 11 сентября 2014

Вот пример кода:

@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();
    }
}
0 голосов
/ 22 марта 2013

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...