35 votes

Android: invite l'utilisateur à enregistrer les modifications lorsque le bouton Retour est enfoncé

J'ai une activité qui contient plusieurs articles modifiables par l'utilisateur (un EditText champ, barre d'evaluation, etc). J'aimerais demander à l'utilisateur si le back/home bouton est enfoncé et que des modifications ont été apportées qui n'ont pas encore été enregistrés. Après la lecture par le biais de l'android à la documentation, il semble que ce morceau de code dans la méthode onPause. J'ai essayé de mettre un AlertDialog dans le onPause toutefois la boîte de dialogue apparait et ensuite immédiatement les larmes vers le bas, car il n'y a rien de bloquer la pause de fin.

C'est ce que j'ai trouvé jusqu'à présent:

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

Suis-je sur la bonne voie ou est-il une autre façon d'accomplir ce que je suis en train de faire ici? Toute aide serait super!

96voto

Daniel Lew Points 39063

Vous n'êtes pas tout à fait sur la bonne voie; ce que vous devez faire est primordial onKeyDown() et à l'écoute de la touche retour, puis en substituant le comportement par défaut:

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

Si vous êtes seulement à soutenir Android 2.0 et plus, ils ont ajouté un onBackPressed() vous pouvez utiliser à la place:

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

Cette réponse est essentiellement arraché de ce blog: http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html

11voto

Oxydant Points 91

Que pensez-vous de cette approche ..

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

}
 

3voto

40-Love Points 1333

Voici un exemple de code:

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

0voto

danigonlinea Points 354

Je fais la même chose que toi. J'ai une activité avec une information client (EditText pour le nom, le nom, l'e-mail, ..., vous savez, EditText partout) et j'ai utilisé AsyncTask pour cela, et cela fonctionne à merveille.

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

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X