Android:按下后退按钮时提示用户保存更改

Posted

技术标签:

【中文标题】Android:按下后退按钮时提示用户保存更改【英文标题】:Android: Prompt user to save changes when Back button is pressed 【发布时间】:2011-01-28 10:13:53 【问题描述】:

我有一个包含多个用户可编辑项目(EditText 字段、RatingBar 等)的活动。如果按下返回/主页按钮并且进行了尚未保存的更改,我想提示用户。在阅读了 android 文档之后,似乎这段代码应该放在 onPause 方法中。我已经尝试在 onPause 中放置一个 AlertDialog ,但是该对话框会显示然后立即关闭,因为没有任何东西可以阻止暂停完成。

这是我目前为止的想法:

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

这个答案基本上是从this blog post 撕下来的。如果您需要键、兼容性支持、虚拟硬键支持或原始解决方案(如@),请阅读它987654322@等

【讨论】:

使用 onKeyDown() 方法会出现与 onPause() 相同的问题。如果我在检测到 Back 键码时尝试在 onKeyDown 块中显示警报对话框,则对话框仍然不会阻塞。我会暂时看到警报,直到按下 super.onKeyDown,这将导致窗口关闭。有没有办法在继续之前强制对 AlertDialog 做出响应? 如果你使用后退按钮,你是在调用 super.onKeyDown() 吗?我假设如果您弹出对话框,您应该只使用“return true”,以便向系统指示您已按下后退按钮;否则,通过调用 super(),你仍然会结束调用所有完成活动的东西。【参考方案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;
    


【讨论】:

以上是关于Android:按下后退按钮时提示用户保存更改的主要内容,如果未能解决你的问题,请参考以下文章

按下后退按钮时保存

当Webview方向更改然后按下后退按钮时,应用程序崩溃

按下后退按钮时未调用Android onUserLeaveHint()

当用户按下后退按钮时隐藏导航抽屉

按下后退按钮未触发

按下后退时 EditText 不会触发更改