防止后退按钮关闭对话框


74

我试图防止在Android中按下“后退”按钮时关闭AlertDialog框。我已经遵循了该线程中的两个流行方法,并且使用System.out.println可以看到在两种情况下代码都可以执行。但是,后退按钮仍会关闭对话框。

我可能做错了什么?最终,我试图防止后退按钮关闭对话框-这是在应用程序首次运行时显示的免责声明,我不希望用户有任何选择,只能在其中按下“接受”按钮。以便该应用继续运行。


1
如果您要求用户接受许可或免责声明(或其他任何内容),则必须允许他们拒绝。如果他们单击该BACK按钮,则请确保下次他们启动该应用程序时一次又一次出现您的许可/免责声明对话框,直到他们接受或从设备中删除该应用程序为止。如果您选择使用Sam建议的方法,则必须提供“拒绝”按钮,但是下次他们启动应用程序时重新创建许可/免责声明。
Squonk 2012年

1
我将删除一个将“接受”作为唯一选项的应用程序……甚至不用考虑禁用主页按钮!
WarrenFaith 2012年

可以通过按“主页”按钮关闭该应用程序,但是,如果不接受许可,则该应用程序实际上无法超过免责声明。@Squonk,您提到我必须允许他们拒绝;这是法律问题吗?也就是说,是否有法律规定必须在不接受许可协议的情况下使用软件(如果已付费)?nb我已经有一个“拒绝”按钮,按下此按钮会弹出Toast(),提示您必须接受协议才能使用该应用程序。该对话框将一直存在,直到按下接受为止。
CaptainProg 2012年

1
@CaptainProg:我不是律师,但我怀疑在某些国家/地区可能将其视为法律问题。我不建议您允许别人拒绝/拒绝免责声明的人使用您的应用程序。我只想说这是不好的政策,不好的客户关系(即使该应用程序是免费的)和UX锁定某人的情况也很糟糕。只需使用“拒绝”选项关闭该应用程序,然后用户下次尝试启动时它,显示相同的对话框。不要仅仅弹出a Toast,而是将它们锁定并使用thwHOME按钮依靠它们出去。
Squonk 2012年

Answers:


171

只需使用setCancelable()功能:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);

这样可以防止后退按钮关闭对话框,但是如果您选择使用它,则使“负”按钮保持原样。


鉴于Squonk的评论,任何不想接受您的服务条款的用户都可以按“主页”按钮,这里还有两种防止他们“退出”用户协议的方法。一个是简单的“拒绝”按钮,另一个是覆盖对话框中的后退按钮:

builder.setNegativeButton("Refuse", new OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which) {
               finish();
           }
       })
       .setOnKeyListener(new OnKeyListener() {
           @Override
           public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
               if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP)
                   finish();
               return false;
           }
       });

37
此外,如果使用DialogFragment,您应该调用setCancelable它而不是调用它Dialog本身
Kuffs 2015年

非常感谢@Kuffs。我在对话框上设置它,想知道为什么它不起作用!
sasikt

22

为了防止后退按钮关闭对话框(不取决于活动),请使用以下代码:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        // Prevent dialog close on back press button
        return keyCode == KeyEvent.KEYCODE_BACK;
    }
});

1
在我的情况下做得很好。我必须WebView在我的应用程序上加载一个。我必须检查canGoBack()并关闭对话框,如果它是错误的。
PNDA

16

使用时,DialogFragment您需要调用setCancelable()片段,而不是对话框:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    dialog = new ProgressDialog(getActivity());
    dialog.setIndeterminate(true);
    dialog.setMessage(...);
    setCancelable(false);

    return dialog;
}

通话dialog.setCancelable()似乎没有效果。似乎DialogFragment没有注意到对话框的可取消性设置。


3

采用 setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance();
sampleDialog.setCancelable(false);
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());

0

只有这对我有用:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(title);
builder.setMessage(content);

/**
 * Make it when the Back button is pressed, the dialog isn't dismissed.
 */
builder.setOnKeyListener(new DialogInterface.OnKeyListener() {
    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            Utilities.makeToast(getContext(), "There is no way back!");
            return true; // Consumed
        }
        else {
            return false; // Not consumed
        }
    }
});

Dialog dialog = builder.create();

/**
 * Make it so touching on the background activity doesn't close the dialog
 */
dialog.setCanceledOnTouchOutside(false);

return dialog;

如您所见,我还添加了dialog.setCanceledOnTouchOutside(false);一行,因此在对话框外点击不会导致它也被关闭。


0

在JQuery Mobile中,弹出窗口向URL添加了一个哈希,以下代码允许后盖在打开时关闭弹出窗口,在关闭时返回到应用程序。您可以对自定义ui框架使用相同的逻辑。

@Override
public void onBackPressed() {

    // check if modal is open #&ui-state=dialog

    if (webView.getVisibility() == View.VISIBLE && webView.getUrl().contains("#&ui-state=dialog")) {
        // don't pass back button action
        if (webView.canGoBack()) {
            webView.goBack();
        }
    } else {
        // pass back button action
        super.onBackPressed();
    }
}

0
AlertDialog.Builder builder = AlertDialog.Builder(this)
Dialog dialog = builder.create()
dialog.setCancelable(false)
dialog.setCanceledOnTouchOutside(false)

这将防止用户在按下后退按钮或触摸对话框窗口外时取消对话框

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.