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

2022-09-01 06:20:40

我有一个包含多个用户可编辑项目(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();
}

我是否在正确的轨道上,或者是否有另一种方法可以完成我在这里想要做的事情?任何帮助都会很棒!


答案 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;
}

这个答案基本上是从这篇博客文章中扯下来的。如果您需要按,兼容性支持,对虚拟硬键的支持或诸如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);
    }

}

推荐