2012-11-08 10 views
9

Ho un AsyncTask di gestire un processo di aggiornamento ragionevolmente lungo la corsa, e voglio una finestra di avanzamento che mostra, in ordine:Come si attiva o disattiva una finestra di dialogo di stato tra determinato e indeterminato?

  1. "aggiornamento di partenza" (per un breve secondo)
  2. "Download update" (nessuna barra di avanzamento — non so quanto grande l'aggiornamento sarà prima di scaricarla)
  3. "Salvare i dati di aggiornamento" (con una barra di avanzamento 0-100%)
  4. "Salvataggio di immagini" (aggiornamento con un 0-100% barra di avanzamento)
  5. "Aggiornamento terminato" (per un ief secondo prima che la finestra di dialogo scompaia)

Ho problemi a passare la finestra di dialogo di avanzamento tra determinato (la barra di avanzamento si presenta) e indeterminata (nessuna barra di avanzamento).

Il codice nel mio AsyncTask segue:

private final ProgressDialog progressDialog; 

public SynchronizeTask(Activity activity) 
{ 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

protected void onPreExecute() { 
    progressDialog.setMessage("Starting update..."); 
    progressDialog.setCancelable(false); 
    progressDialog.show(); 
} 

...lots of code here... 

// all of these are set from doInBackground() 
private String progressMsg; 
private int progressTotal; 
private int progressProgress; 

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setMax(0); 
     progressDialog.setProgress(0); 
    } 
} 

ho provato la commutazione determinato con setIndeterminate() — Il problema qui è che gli spettacoli finestra di avanzamento "nan" e "0%" nella parte inferiore della finestra di dialogo, anche se non c'è una "barra" rimasta in modalità indeterminata.

Quindi ho provato a utilizzare setProgressNumberFormat() e setProgressPercentFormat() solo per nascondere i numeri — ma nessuno di questi è supportato in Android inferiore a 3.0.

Poi ho provato ad utilizzare setProgressStyle() per passare da STYLE_SPINNER e STYLE_HORIZONTAL — chiamando setProgressStyle() nel mio onProgressUpdate() sembra causare la mia app in crash.

C'è un modo semplice per attivare una finestra di dialogo di avanzamento tra modalità determinata e indeterminata?

risposta

3

Potrebbe essere una buona idea chiudere una finestra di dialogo di avanzamento e aprirne un'altra, con uno stile diverso.

+1

OK, che sembra funzionare - Avevo pensato che non sarei stato in grado di ricreare un ProgressDialog "al volo", ma sembra funziona bene dato che onProgressUpdate() gira sul thread dell'interfaccia utente. Ho impostato un flag booleano "newDialog" per ogni nuova "fase" dell'aggiornamento e se vedo che il flag è impostato nel mio onProgressUpdate() I: chiude la vecchia finestra di dialogo; creare una nuova finestra di dialogo con il mio stile scelto (spinner o orizzontale); mostra la nuova finestra di dialogo; imposta newDialog su false. Grazie per il consiglio. – George

-1

È possibile modificare il codice per questo:

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setProgressNumberFormat("%1d/%2d"); 
     progressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance()); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setProgressNumberFormat(null); 
     progressDialog.setProgressPercentFormat(null); 
    } 
} 
Problemi correlati