web-dev-qa-db-de.com

Verhindern, dass die Zurück-Schaltfläche ein Dialogfeld schließt

Ich versuche zu verhindern, dass ein AlertDialogfeld geschlossen wird, wenn Sie in Android die Zurück-Taste drücken. Ich bin beiden populären Methoden in diesem Thread gefolgt, und mit System.out.println kann ich sehen, dass in beiden Fällen der Code ausgeführt wird. Die Zurück-Schaltfläche still schließt jedoch das Dialogfeld.

Was könnte ich falsch machen? Letztendlich versuche ich zu verhindern, dass die Zurück-Schaltfläche ein Dialogfeld schließt. Dies ist ein Haftungsausschluss, der angezeigt wird, wenn die App zum ersten Mal ausgeführt wird. Ich möchte nicht, dass der Benutzer eine andere Option hat, als die Schaltfläche "Akzeptieren" in zu drücken um die App fortzusetzen.

57
CaptainProg

Verwenden Sie einfach die Funktion setCancelable() :

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

Dadurch wird verhindert, dass die Zurück-Schaltfläche den Dialog schließt, die "Negativ" -Schaltfläche bleibt jedoch erhalten, wenn Sie sie verwenden.


Während jeder Benutzer, der Ihre Nutzungsbedingungen nicht akzeptieren möchte, die Home-Taste drücken kann, unter Berücksichtigung des Kommentars von Squonk, gibt es zwei weitere Möglichkeiten, um zu verhindern, dass die Benutzervereinbarung "zurückgezogen" wird. Eine ist eine einfache Schaltfläche "Ablehnen" und die andere überschreibt die Schaltfläche "Zurück" im 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;
           }
       });
142
Sam

Um zu verhindern, dass die Zurück-Schaltfläche einen Dialog schließt (ohne von der Aktivität abhängig zu sein), wird lediglich der folgende Code angezeigt:

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;
    }
});
14
falvojr

Wenn Sie DialogFragment verwenden, müssen Sie setCancelable() für das Fragment aufrufen, nicht den Dialog:

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

    return dialog;
}

Der Aufruf von dialog.setCancelable() scheint keine Wirkung zu haben. Es scheint, dass DialogFragment die Einstellung des Dialogs für die Stornierbarkeit nicht berücksichtigt. 

7
Ognyan

Verwenden Sie setCancelable(false)

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

In JQuery Mobile fügt ein Popup der URL einen Hash hinzu. Mit dem folgenden Code kann das Popup-Fenster beim Öffnen geschlossen und beim Schließen zur App zurückgegeben werden. Sie können dieselbe Logik für ein benutzerdefiniertes UI-Framework verwenden.

@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

Nur das hat für mich funktioniert:

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;

Wie Sie sehen, habe ich auch eine dialog.setCanceledOnTouchOutside(false);-Zeile hinzugefügt, so dass das Tippen außerhalb des Dialogs nicht dazu führt, dass es auch geschlossen wird.

0