2012-09-11 5 views
10

Ho Button, che al momento del clic visualizza uno Dialog. Tutto funziona come un fascino, ma se faccio doppio clic sul pulsante o clic sul pulsante veloce, lo Dialog si apre due o tre volte. Devo fare clic sul pulsante Indietro due o tre volte per eliminare lo Dialog.Finestra di dialogo aperta due volte al clic veloce del pulsante

Ho cercato per le domande relative a SO, ma la maggior parte delle risposte suggeriscono disabilitare il pulsante o per utilizzare una variabile e impostarla a vero e falso, che non è il mio requisito.

Se qualcuno sa come risolvere questo problema, per favore aiutatemi.

Codice ho usato

// Delete item on click of delete button 
holder.butDelete.setOnClickListener(new OnClickListener() {   
@Override 
    public void onClick(View v) { 
     Dialog passwordDialog = new Dialog(SettingsActivity.this);  
     passwordDialog.show(); 
    } 
}); 
+0

come rendere il codice all'interno di 'onClick()' sincronizzato e mettendo un controllo per se la finestra di dialogo è già aperta. –

+0

Guarda la mia risposta aggiornata .. – user370305

+1

Dayuuuum! sei troppo più veloce di un processore;) – waqaslam

risposta

10

Si controlla solo se il Dialog è già visualizzato o no:

Dialog passwordDialog = new Dialog(SettingsActivity.this); 
holder.butDelete.setOnClickListener(new OnClickListener() {   
    @Override 
    public void onClick(View v) {     
     if(!passwordDialog.isShowing()) { 
      passwordDialog.show(); 
     } 
    } 
}); 

Aggiornamento:

Se questo doesn' t lavorare nel tuo caso, quindi nella vostra attività dichiara globalmente:

Dialog passwordDialog = null; 

e Button s' clic:

holder.butDelete.setOnClickListener(new OnClickListener() {   
    @Override 
    public void onClick(View v) {     
     if(passwordDialog == null) { 
      passwordDialog = new Dialog(SettingsActivity.this); 
      passwordDialog.show(); 
     } 
    } 
}); 
+0

Ho usato questo ... funziona, ma a volte in un clic veloce mostra la finestra di dialogo due volte ... ecco perché ho postato la domanda. – Rahul

+0

Ma nel mio Dialog passwordDialog è una variabile locale ... come ho usato in un posto solo così non lo dichiaro globalmente – Rahul

+0

ok ... proverò a farti sapere. – Rahul

0

disabilitare il pulsante una volta si è fatto clic e attivare di nuovo una volta che si annulla la finestra. come qui di seguito

holder.butDelete.setOnClickListener(new OnClickListener() 
      {   
       @Override 
       public void onClick(View v) 
       { 
        holder.butDelete.setEnabled(false); 
        Dialog passwordDialog = new Dialog(SettingsActivity.this);  
        passwordDialog.show(); 
       } 
      }); 

se non ha funzionato si deve prendere una variabile booleana e l'uso che per mostrare e annullare la finestra di dialogo.

+0

Non penso che tu abbia letto la mia domanda ... ho scritto in grassetto su questo. – Rahul

+0

oh scusa, non l'ho visto. – sankar

0

Probabilmente le finestre di dialogo dovrebbero essere gestite dalla tua attività, ignorando il metodo onCreateDialog() e chiamando showDialog(). Questo risolverebbe il tuo problema.

Vedi http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int, android.os.Bundle)

richiamata per la creazione di finestre di dialogo che sono gestiti (salvati e ripristinati) per voi dall'attività. L'implementazione predefinita richiama a onCreateDialog (int) per la compatibilità. Se scegli come target HONEYCOMB o successivo, considera invece l'utilizzo di un DialogFragment.

Esempio:

public class TestActivity extends Activity { 

private static final int TEST_DIALOG_ID = 1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    showDialog(TEST_DIALOG_ID); 
} 

@Override 
protected Dialog onCreateDialog(int id) { 
    if(id == TEST_DIALOG_ID) { 
     Dialog passwordDialog = new Dialog(this);  
     return passwordDialog; 
    } 
    return super.onCreateDialog(id); 
} 

} 
+0

puoi mostrarmi con un esempio ........ – Rahul

+0

Vedere il codice nella mia modifica – fiddler

+0

showDialog ha funzionato benissimo, ma è stato deprecato. –

-1

provare come questo ...

Dialog passwordDialog = new Dialog(SettingsActivity.this); 


holder.butDelete.setOnClickListener(new OnClickListener() 
{   
      @Override 
      public void onClick(View v) 
      {       
       if(!passwordDialog.isShowing()) { 
        passwordDialog.show(); 
       } 
      } 
}); 
+0

Questo non funzionerà mai, 'passwordDialog.isShowing()' viene chiamata ogni volta su un'istanza appena creata. –

3

Si dovrebbe davvero utilizzare FragmentManager per mostrare il dialogFragment.Poi sarà facile per chiedere se il fragmentManager conosce una specifica tag dialogFragment:

Fragment foundFragment = getFragmentManager().findFragmentByTag("myItemEditDialogFragment"); 
if (foundFragment == null) { 
    DialogFragment df = ItemEditDialogFragment.newInstance(o); 
    df.setTargetFragment(this, 0); 
    df.show(getFragmentManager().beginTransaction(), "myItemEditDialogFragment"); 
} 

Questo è ciò che il metodo newInstance statica DialogFramgnet assomiglia:

public static ItemEditDialogFragment newInstance(Item o) { 
    ItemEditDialogFragment df = new ItemEditDialogFragment(); 

    Bundle args = new Bundle(); 
    args.putParcelable(ARG_INSTANCE, o); 
    df.setArguments(args); 

    return df; 
} 
+1

non funziona, se chiamato due volte senza intervallo di tempo, FragmentManager non conoscerà ancora la finestra di dialogo. – Frank

6

Dichiarato a livello globale:

private Boolean dialogShownOnce = false; 
private mDialog dia; 

Dove viene chiamato il tuo dialog.show();:

dia = new mDialog(getContext()); 

if (!dia.isShowing() && !dialogShownOnce) { 
    dia.show(); 
    dialogShownOnce = true; 
} 

dia.setOnDismissListener(new DialogInterface.OnDismissListener() { 
    @Override 
    public void onDismiss(DialogInterface dialog) { 
     dialogShownOnce = false; 
    } 
}); 

mDialog non deve essere globale, ma stavo chiamando mDialog.dismiss() in alcune interfacce fuori ambito.

utilizza ancora un Boolean, ma non capisco perché non può essere utilizzato.

0

provare questo.

Fase 1. Dichiarare oggetto finestra come variabile di istanza o variabile globale

private MediaPlayerDialog dialog; 

Fase 2. ora messo sotto il codice in voi btton clic.

if (dialog == null || (!dialog.isVisible())) { 
     dialog = new MediaPlayerDialog(); 
     dialog.setData(songListDatas, selectPosition); 
     dialog.show(getSupportFragmentManager(), dialog.getClass().getName().toString()); 
    } 

Nota:MediaPlayer è mia abitudine DialogFragment si può cambiare secondo il vostro requisito.

Buona fortuna

1

inserire questo codice in cui si desidera mostrare il dialogo, si controlli esistono base di dialogo sul suo nome tag.

FragmentTransaction ft = getFragmentManager().beginTransaction(); 
Fragment prevFragment = getFragmentManager().findFragmentByTag("dialog"); 
if (prevFragment != null) { 
    return; 
} 

MyDialog dialog = MyDialog.newInstance(); 
dialog.show(ft, "dialog"); 
+0

Per favore aggiungi sempre una spiegazione al tuo codice. –