2012-08-27 10 views
47

Ich versuche zu verhindern, dass eine AlertDialog-Box geschlossen wird, wenn Sie in Android die Zurück-Taste drücken. Ich habe beide populären Methoden in this thread gefolgt, und mit System.out.println kann ich sehen, dass in beiden Fällen der Code ausgeführt wird. Die Schaltfläche "Zurück" immer noch schließt das Dialogfeld.Schaltfläche "Zurück" zum Schließen eines Dialogfelds verhindern

Was könnte ich falsch machen? Letztendlich versuche ich zu verhindern, dass die Zurück-Schaltfläche ein Dialogfeld schließt - es ist ein Haftungsausschluss, der beim ersten Start der App angezeigt wird und ich möchte nicht, dass der Benutzer eine Option hat, sondern die Schaltfläche "Akzeptieren" drücken muss Bestellung für die App, um fortzufahren.

+1

Wenn Sie möchten, dass ein Benutzer eine Lizenz oder einen Haftungsausschluss (oder was auch immer) akzeptiert, dann MÜSSEN Sie ** ihnen erlauben, die Teilnahme abzulehnen. Wenn sie auf die Schaltfläche "ZURÜCK" klicken, stellen Sie sicher, dass Ihr Lizenz-/Haftungsausschluss-Dialog beim nächsten Start der App und immer wieder erscheint, bis sie die App entweder akzeptieren oder aus ihrem Gerät entfernen. Wenn Sie den von Sam vorgeschlagenen Ansatz verwenden, MÜSSEN Sie ** die Schaltfläche "Ablehnen" angeben, die Lizenz/den Haftungsausschluss jedoch beim nächsten Start der App erneut erstellen. – Squonk

+1

Ich würde eine App entfernen, die mir "akzeptiert" als einzige Option ... und nicht einmal daran denken, die Home-Taste deaktivieren! – WarrenFaith

+0

Die App kann durch Drücken der Home-Taste geschlossen werden, aber im Wesentlichen kann die App nicht über den Haftungsausschluss hinauskommen, wenn die Lizenz nicht akzeptiert wird. @Squonk, du erwähnst, dass ich * ihnen erlauben muss, zu verweigern; Ist das ein rechtliches Problem? Gibt es ein Gesetz, nach dem Software verwendbar sein muss (wenn sie bezahlt wurde), ohne die Lizenzvereinbarung zu akzeptieren? n.b. Ich habe bereits einen "Ablehnen" -Button, und wenn Sie dies drücken, erscheint ein Toast(), der besagt, dass Sie die Vereinbarung akzeptieren müssen, um die App nutzen zu können. Das Dialogfeld bleibt so lange bestehen, bis die Bestätigungstaste gedrückt wird. – CaptainProg

Antwort

110

Verwenden Sie einfach das setCancelable() Feature:

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

Dies verhindert, dass die Zurück-Taste aus dem Dialog zu schließen, läßt aber die „negative“ Taste intakt, wenn Sie gewählt haben, es zu benutzen.


Während jeder Benutzer, der nicht Ihre Nutzungsbedingungen nicht akzeptieren möchte, kann die Home-Taste drücken, im Lichte der Squonk Kommentar, hier noch zwei weitere Möglichkeiten, sie zu verhindern, dass „Rückzieher“ der Nutzungsvereinbarung. Eine davon ist ein einfaches „Refuse“ und die anderen überschreibt die Zurück-Taste 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; 
      } 
     }); 
+0

es funktioniert, danke –

+18

Zusätzlich, wenn Sie ein 'DialogFragment' verwenden, sollten Sie' setCancelable' darauf und nicht auf dem 'Dialog' selbst aufrufen – Kuffs

+0

vielen Dank @Kuffs. Ich stellte es auf den Dialog und fragte mich, warum es nicht funktioniert! – sasikt

10

die Zurück-Taste schließt einen Dialog zu verhindern (ohne je nach Aktivität), nur den folgenden Code ein:

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

Arbeitete wunderbar in meinem Fall. Ich musste eine 'WebView' in meiner App laden. Ich musste 'canGoBack()' überprüfen und den Dialog schließen, falls dieser falsch war. – pandalion98

1

Verwenden setCancelable(false)

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

Nur das für mich gearbeitet:

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 können, fügte ich auch eine dialog.setCanceledOnTouchOutside(false); Zeile hinzu, so dass das Tippen außerhalb des Dialogs nicht dazu führt, dass es auch nicht geschlossen wird.

0

Wenn DialogFragment verwenden Sie müssen setCancelable() auf dem Fragment rufen, nicht der Dialog:

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

    return dialog; 
} 

dialog.setCancelable() Aufruf scheinen keine Wirkung zu haben. Es scheint, dass DialogFragment nicht die Einstellung des Dialogfelds für die Löschbarkeit beachtet.

Verwandte Themen