2012-09-11 13 views
10

Tengo Button, que al hacer clic, muestra Dialog. Todo funciona como un amuleto, pero si hago doble clic en el botón o hago clic en el botón rápido, el Dialog se abre dos o tres veces. Tengo que hacer clic dos o tres veces en el botón Atrás para cerrar el Dialog.Cuadro de diálogo abrir dos veces al hacer clic rápido en el botón

He buscado para preguntas relacionadas sobre SO, pero la mayoría de las respuestas sugieren deshabilitar el botón o para usar una variable y se establece en verdadero y falso, que no es mi requisito.

Si alguien sabe cómo resolver este problema, por favor, ayúdeme.

Código he utilizado

// 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

cómo hacer código en 'onClick()' sincronizado y marcando si el diálogo ya está abierto. –

+0

Mira mi respuesta actualizada .. – user370305

+1

Dayuuuum! eres demasiado rápido que un procesador;) – waqaslam

Respuesta

10

Tienes que acaba de comprobar si su ya se mostró Dialog o no:

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

Actualización:

Si este doesn' trabaje en su caso, entonces en su actividad declaran a nivel mundial:

Dialog passwordDialog = null; 

y en 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

Utilicé esto ... funciona, pero a veces con un clic rápido aparece el cuadro de diálogo dos veces ... es por eso que publiqué la pregunta. – Rahul

+0

Pero en mi Dialog passwordDialog es una variable local ... como usé en un solo lugar, así que no lo declaro globalmente – Rahul

+0

ok ... lo intentaré y lo sabré. – Rahul

0

desactivar el botón una vez ha hecho clic en él y habilitar de nuevo una vez que cancele el cuadro de diálogo. como a continuación

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

si no funciona hay que tomar una variable booleana y usarlo para mostrar y cancelar el diálogo.

+0

No creo que hayas leído mi pregunta ... He escrito en negrita sobre esto. – Rahul

+0

oh lo siento, no vi eso. – sankar

0

Probablemente debería tener sus diálogos gestionados por su actividad, anulando el método onCreateDialog() y llamando al showDialog(). Eso resolvería tu problema.

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

de devolución de llamada para la creación de cuadros de diálogo que se manejan (guardar y restaurar) para que por la actividad. La implementación predeterminada llama a onCreateDialog (int) para compatibilidad. Si tiene como objetivo HONEYCOMB o posterior, considere en su lugar usar un DialogFragment.

Ejemplo:

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

me puede mostrar con un ejemplo ........ – Rahul

+0

Ver el código en mi edición – fiddler

+0

showDialog funcionó muy bien, pero ha quedado obsoleto. –

-1

tratan así ...

Dialog passwordDialog = new Dialog(SettingsActivity.this); 


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

Esto nunca funcionará, 'passwordDialog.isShowing()' se llama en una instancia recién creada cada vez. –

3

Usted realmente debe utilizar para mostrar FragmentManager el dialogFragment.A continuación, será fácil para preguntar si el fragmentManager sabe acerca de un determinado etiquetado dialogFragment:

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

Esto es lo que parece el método newInstance estática DialogFramgnet como:

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

no funciona, si se llama dos veces sin tiempo entremedias, FragmentManager aún no conocerá el diálogo. – Frank

6

declarados globalmente:

private Boolean dialogShownOnce = false; 
private mDialog dia; 

Donde se llama su 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 no tiene que ser global, pero estaba llamando al mDialog.dismiss() en algunas interfaces de fuera del alcance local.

Todavía usa un Boolean, pero no entiendo por qué no se puede usar.

0

prueba esto.

Paso 1. Declarar objeto de diálogo como variable de instancia o variable global

private MediaPlayerDialog dialog; 

Paso 2. ahora poner a continuación el código en el que btton clic.

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

Nota:MediaPlayer es mi costumbre DialogFragment se puede cambiar de acuerdo a sus requerimientos.

mejor de la suerte

1

poner este código en el que desea mostrar de diálogo, se comprueba la base de diálogo en su etiqueta con su nombre existe.

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

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

Siempre agregue una explicación a su código. –

Cuestiones relacionadas