2010-09-29 4 views
6

creo un ProgressDialog en onCreateDialog() así:ProgressDialog creados a partir de onCreateDialog deja de animación en la segunda carrera

protected Dialog onCreateDialog(int id) { 
    if (id == DIALOG_PROGRESS_ID) 
    { 
     ProgressDialog dialog = new ProgressDialog(this); 
     dialog.setMessage(getResources().getString(R.string.MyLabel)); 
     dialog.setCancelable(false); 
     dialog.setIndeterminate(true); 
     return dialog; 
    } 
} 

Android, en su sabiduría (o grave falta de ella) decide almacenar en caché cada diálogo creado a través onCreateDialog() . Por eso, cualquier llamada posterior al showDialog(DIALOG_PROGRESS_ID) da como resultado que se use la misma instancia de ProgressDialog, pero la animación ha dejado de funcionar.

He intentado volver a establecer indeterminado en onPrepareDialog(), pero eso no hace nada. Tampoco hay un método obvio para invocar la instancia de diálogo que reiniciará la animación.

protected void onPrepareDialog(int id, Dialog dialog) 
{ 
    //This doesn't do anything 
    if (id == DIALOG_PROGRESS_ID) 
    ((ProgressDialog)dialog).setIndeterminate(true); 
    super.onPrepareDialog(id, dialog); 
} 

EDITAR: ¿Pero tal vez hay una forma de obtener ProgressBar y comenzar a animar? así que he intentado lo siguiente después hice esta pregunta:

@Override 
protected void onPrepareDialog(int id, Dialog dialog) 
{ 
    if (id == DIALOG_PROGRESS_ID) 
    { 
    ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress); 
    if (p.getAnimation() != null) 
     p.startAnimation(p.getAnimation()); 
    } 
    super.onPrepareDialog(id, dialog); 

}

Pero no funcionó bien !

Entonces, ¿alguien sabe si hay una forma de reiniciar la animación en un ProgressDialog? Si no, ¿hay alguna manera de forzar cada llamada a showDialog() para llamar aCreateDialog()? (esta segunda pregunta fue respondida por @TuomasR, pero después de considerarla no creo que esta sea una solución muy buena para mi problema)

Respuesta

15

¡Ja! Entendido ... también estaba luchando con esto. Pero llamar:

removeDialog(DIALOG_PROGRESS_ID) 

inmediatamente después

dismissDialog(...) 

lo quita de la (presunta) de caché de diálogo para la actividad y fuerza una llamada a onCreateDialog. Cree un nuevo ProgressDialog en onCreateDialog y el spinner se anima cada vez (al menos para mí).

+2

No hay necesidad de llamar al método 'dismissDialog' - puede simplemente llamar a' removeDialog', ya que 'Si el diálogo se muestra, lo descartará como parte de la limpieza' (de JavaDoc) – Idolon

0

Bueno, una solución no tan genial sería editar los parámetros y no declarando el int privado como en los ejemplos. Por supuesto, se pierde la capacidad de cambiar el onCreateDialog, pero no parecen estar haciendo eso de todos modos:

showDialog(++DIALOG_PROGRESS_ID); 

Por supuesto, si el cuadro de diálogo se muestra en numerosas ocasiones, puede tener errores de memoria. No es bonito, pero debería funcionar.

+0

Estoy cambiando el código actual, lo edité a los bits relevantes para la pregunta.Usted plantea un buen punto que realmente no consideré: si forzamos que se llame aCreateDialog() cada vez, forzamos a Android a almacenar en caché todos estos cuadros de diálogo. Grrr! Android está lleno de estos bordes ásperos. – ageektrapped

1

No me gusta eliminar el diálogo para volver a crearlo en la próxima presentación. Por lo tanto, resuelvo este problema usando onCreateDialog y onPrepareDialog:

1) En onCreateDialog normalmente creo el ProgressDialog. 2) En onPrepareDialog que hacen referencia al progressBar su interior y obliga a reiniciar:

@Override 
protected void onPrepareDialog(int id, Dialog dialog, Bundle args) { 
    switch (id){ 

     ..... 

     case DIALOG_PROGRESS_ID: 
      ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress); 
      p.setVisibility(View.GONE); 
      p.setVisibility(View.VISIBLE); 
     break; 
    } 
} 
0

También puede probar.

if (progressDialog != null) { 
    progressDialog.dismiss(); 
    progressDialog = null; 
} 
Cuestiones relacionadas