2012-09-24 21 views
8

Moja aplikacja na Androida pokazuje AlertDialog po kliknięciu przycisku. Kiedy kliknę przycisk więcej niż raz, tworzone jest więcej niż jedno okno dialogowe. Jak mogę to naprawić?Jak wyświetlić tylko jedno okno dialogowe na raz?

Oto mój kod:

button.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     dialog = new AlertDialog.Builder(context);    
     dialog.show(); 
    } 
}); 
+2

Pokaż nam swój kod ... – RvdK

+0

Zamiast AlertDialog.Builder używam niestandardowej klasy rozciąga AlertDialog. który pokazuje obraz. Brak przycisków. –

+1

Zgadnij, że nadal możesz używać tej samej koncepcji. Po prostu utwórz typ flagi :) – Araw

Odpowiedz

4

Można utworzyć globalną flagę (boolean), która jest ustawiona na true, jeśli wyświetlane jest okno dialogowe? Jeśli użytkownik kliknie przycisk OK, tak, nie, lub nic, okno dialogowe zostanie zamknięte i ustawisz flagę na wartość false.

Więc coś takiego:

boolean dialogShown; 

If(dialogShown) 
{ 
    return; 
} 
else 
{ 
    dialogShown = true; 
    dialog = new AlertDialog.Builder(context);    
    dialog.show(); 
} 
+1

zawsze umieszczam klocki w nawiasach, nawet jednolinijkowych. Oszczędzisz sobie wielu kłopotów (szczególnie przy użyciu języków z preprocesorem i makrami). –

0

Za każdym naciśnięciem przycisku wywołać metodę. Dlatego jest pokazywany wiele razy.

Najprostszym sposobem jest po prostu zdefiniować zmienną instancji w swojej klasie kodzie jak:

boolean alertIsBeingShown = NO; 

Następnie ustawić go na true, gdy alarm jest pokazane jak to

button.setOnClickListener(new OnClickListener() { 
      @Override 
     public void onClick(View v) { 
       if (alertIsBeeingShown) return; 
       alertIsBeingShown = YES; 
       dialog = new AlertDialog.Builder(context);    
       dialog.show(); 

    } 
}); 

i ustaw zmienną na false w kodzie, w którym naciśniesz przycisk OK, aby zniknęła.

+0

Dlaczego używasz TAK i NIE? –

+1

zbyt duży cel-c, chyba –

0

Utwórz dla niego przycisk dodatni lub ujemny i po prostu wywołaj go jako OK i użyj go do odrzucenia. Coś jak:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setMessage("Look at this dialog!") 
     .setCancelable(false) 
     .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       //do things 
      } 
     }); 
AlertDialog alert = builder.create(); 
alert.show(); 
-1

Tworzenie okna w try-catch bloku jak ten:

try { 
     dialog.setVisible(true); 
    } catch (NullPointerException e) { 
     dialog = new AlertDialog.Builder(context);    
     dialog.show(); 
    } 

Podczas pierwszego wykonania tego, NullPointerException jest wyrzucane, a okno jest stworzony. Następujące czasy nic nie będzie widoczne.

16

trzeba sprawdzić czy isShowing dialogowe lub nie

Dialog ma metodę isShowing(), które powinny powrócić, jeśli okno jest obecnie widoczna.

public AlertDialog myDialog; 

public void showDialog(Context context) { 
    if(myDialog != null && myDialog.isShowing()) return; 

    AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    builder.setTitle("Title"); 
    builder.setMessage("Message"); 
    builder.setPositiveButton("ok", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int arg1) { 
       dialog.dismiss(); 
      }}); 
    builder.setCancelable(false); 
    myDialog = builder.create(); 
    myDialog.show(); 
    } 
+0

Niesamowite. Zasługujesz na więcej niż 1 przebój :) – Prabs

Powiązane problemy