2010-06-30 2 views
19

Ich verwalte Dialoge von showDialog/dismissDialog/removeDialog.Wie überprüft man, ob ein Dialog angezeigt wird oder mehrere Dialoge desselben Typs anzeigen?

Ich möchte:

Anzeige mehrere Dialoge in Art eines Stapels:

a) Erster Dialog wird gezeigt mit showDialog(DIALOG_TYPE)

b) Als nächstes Dialoge sind auf dem bestehenden Dialog

gezeigt

Jetzt kann ich nur erste Dialog mit showDialog anzeigen und dann die nächsten Dialoge werden ignoriert.

Anzeige der letzte Dialog:

a) Erster Dialog mit gezeigt showDialog(DIALOG_TYPE)

b) Anwendung überprüft, ob Dialogfeld angezeigt wird, schließt Dialog (wenn es angezeigt wird) und öffnet einen neuen Dialog.

Gibt es eine Möglichkeit, eine der oben genannten Lösungen zu erreichen?

Antwort

54

Dialog verfügt über eine isShowing()-Methode, die zurückgegeben werden soll, wenn der Dialog gerade sichtbar ist. Sie können das also verwenden, um zu sehen, ob ein Dialog angezeigt wird, und es mit findDialog() ausblenden. Sie müssen nur einen Verweis auf die Dialoge behalten, die Sie in onCreateDialog() erstellen.

+0

Ok, das erfüllt das erste Szenario, aber was ist das Stapeln? Vielleicht gibt es eine Möglichkeit, mehrere Dialoge des gleichen Typs anzuzeigen? – pixel

+4

Scheint nicht zum Stapeln zu funktionieren. Wenn ich mehrere Dialoge übereinander staple, gelten beide für die show-Eigenschaft. –

3

Sie können Flag verwenden, um zu prüfen, ob der Dialog geöffnet ist oder nicht und je nach Flag-Wert können Sie tun, was Sie wollen. Wie ich es getan habe. Ich habe nur einen Dialog, aber wenn ich einen anderen EditText berühre und wenn mein Dialog geöffnet wird, sollte er zuerst schließen und dann mit Animation wieder öffnen.

Code-Snippet:

private EditText mEditText, mEditCode; 
    private Dialog mDialog; 
    private int mClicked = 0; 
    private boolean isShown = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mEditText = (EditText)findViewById(R.id.EnterValue); 
     mEditText.setClickable(true); 
     mEditText.setOnClickListener(this); 

     mEditCode = (EditText)findViewById(R.id.EnterCode); 
     mEditCode.setClickable(true); 
     mEditCode.setOnClickListener(this); 
    } 

    public void onClick(View nView) 
    { 
     switch (nView.getId()) 
     { 
     case R.id.EnterValue: 
      mClicked = R.id.EnterValue; 
      mEditText.requestFocus(); 
      mEditText.setFocusableInTouchMode(false); 
      mEditText.setEnabled(true); 
      mEditText.setSelection(mEditText.getText().toString().trim().length()); 
      if(isShown) 
      { 
       mDialog.dismiss(); 
       showInfoDialog(); 
      } 
      else 
      { 
       showInfoDialog(); 
      } 
      break; 
     case R.id.EnterCode: 
      mClicked = R.id.EnterCode; 
      mEditCode.requestFocus(); 
      mEditCode.setFocusableInTouchMode(false); 
      mEditCode.setEnabled(true); 
      mEditCode.setSelection(mEditCode.getText().toString().trim().length()); 
      if(isShown) 
      { 
       mDialog.dismiss(); 
       showInfoDialog(); 
      } 
      else 
      { 
       showInfoDialog(); 
      } 
      break; 
     } 
    } 

    private boolean showInfoDialog() 
    { 
     mDialog = new Dialog(CustomKeyboardNotLikeAndroidActivity.this, R.style.PauseDialog); 
     mDialog.setContentView(R.layout.keyboard); 
     mDialog.getWindow().getAttributes().windowAnimations = R.style.PauseDialogAnimation; 
     mDialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 
     mDialog.setCancelable(true); 
     isShown = true; 
     mDialog.show(); 
     return false; 
    } 

Versuchen Sie diesen Code in Ihrer Art und Weise zu verändern. Hoffe, das kann dir helfen. Vielen Dank.

3

Dialog implementiert DialogInterface, die OnShowListener hat.

Daher können Sie folgenden Code verwenden:

Dialog dialog = new Dialog(context); 
// ... set all things considering your dialog 
dialog.setOnShowListener(new DialogInterface.OnShowListener() { 
    @Override 
    public void onShow(DialogInterface dialog) { 
     // do something when your dialog is shown  
    } 
}); 
Verwandte Themen