Prevent back button from closing a dialog box

前端 未结 7 1314
别那么骄傲
别那么骄傲 2021-01-30 05:17

I am trying to prevent an AlertDialog box from closing when pressing the back button in Android. I have followed both of the popular methods in this thread, and with System.out.

相关标签:
7条回答
  • 2021-01-30 05:25

    Simply use the setCancelable() feature:

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

    This prevents the back button from closing the dialog, but leaves the "negative" button intact if you chose to use it.


    While any user that does not want to accept your terms of service can push the home button, in light of Squonk's comment, here two more ways to prevent them from "backing out" of the user agreement. One is a simple "Refuse" button and the other overrides the back button in the dialog:

    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;
               }
           });
    
    0 讨论(0)
  • 2021-01-30 05:26

    When using DialogFragment you will need to call setCancelable() on the fragment, not the dialog:

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

    Calling dialog.setCancelable() seem to have no effect. It seems that DialogFragment does not takes notice of the dialog's setting for cancelability.

    0 讨论(0)
  • 2021-01-30 05:30

    To prevent the back button closes a Dialog (without depending on Activity), just the following code:

    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;
        }
    });
    
    0 讨论(0)
  • 2021-01-30 05:31

    Use setCancelable(false)

    SampleDialog sampleDialog = SampleDialog.newInstance();
    sampleDialog.setCancelable(false);
    sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName());
    
    0 讨论(0)
  • 2021-01-30 05:32

    In JQuery Mobile a popup adds a hash to the url, the following code allows the back to dismiss the popup when open and return to the app when closed. You could use the same logic for a custom ui framework.

    @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 讨论(0)
  • 2021-01-30 05:47
    AlertDialog.Builder builder = AlertDialog.Builder(this)
    Dialog dialog = builder.create()
    dialog.setCancelable(false)
    dialog.setCanceledOnTouchOutside(false)
    

    This will prevent the user on canceling the dialog when they press the back button or touch outside the dialog window

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