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

前端 未结 4 616
遇见更好的自我
遇见更好的自我 2020-11-27 04:45

I have an activity that contains several user editable items (an EditText field, RatingBar, etc). I\'d like to prompt the user if the back/home button is pressed and change

相关标签:
4条回答
  • 2020-11-27 05:22

    Here is some sample 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();
        }
    }
    
    0 讨论(0)
  • 2020-11-27 05:23

    What do you think about this approach ..

    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);
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 05:27

    I am doing the same thing that you do. I have one activity with a customer information (EditText for name, last name, email, ..., you know, EditText everywhere) and I used AsyncTask for that, and it works wonderfully.

        @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;
        }
    
    }
    
    0 讨论(0)
  • 2020-11-27 05:36

    You're not quite on the right track; what you should be doing is overriding onKeyDown() and listening for the back key, then overriding the default behavior:

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

    If you're only supporting Android 2.0 and higher, they've added an onBackPressed() you can use instead:

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

    This answer is essentially ripped from this blog post. Read it if you need long presses, compatibility support, support for virtual hard keys, or raw solutions like onPreIme() etc.

    0 讨论(0)
提交回复
热议问题