2010-05-09 8 views
35

Sto provando a creare un ProgressDialog per un'applicazione Android (solo uno semplice che mostra all'utente che sta accadendo qualcosa, nessun pulsante o altro) ma non riesco a farlo bene. Ho consultato forum e tutorial oltre al codice di esempio fornito con l'SDK, ma senza risultati.Android: ProgressDialog non mostra

Questo è quello che ho ottenuto:

btnSubmit.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
     (...) 
      ProgressDialog pd = new ProgressDialog(MyApp.this); 
      pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      pd.setMessage("Working..."); 
      pd.setIndeterminate(true); 
      pd.setCancelable(false); 

      // now fetch the results 
      (...long time calculations here...) 

      // remove progress dialog 
      pd.dismiss(); 

Ho anche provato ad aggiungere pd.show(); e pasticciato con il parametro in new ProgressDialog conseguente nulla (tranne gli errori che il parametro prescelto non funziona), significato: ProgressDialog non si presenterà mai. L'app continua a funzionare come se non avessi mai aggiunto la finestra di dialogo.

Non so se sto creando la finestra di dialogo nel posto giusto, l'ho spostato un po ', ma anche questo non ha aiutato. Forse sono nel contesto sbagliato? Il codice sopra riportato è all'interno di private ViewGroup _createInputForm() in MyApp.

Qualsiasi suggerimento è apprezzato,

risposta

39

bisogna chiamare pd.show prima lunghe inizio calcolo e quindi il calcolo deve essere eseguito in un thread separato. Appena questo thread è terminato, devi chiamare pd.dismiss() per chiudere la finestra di dialogo prgoress.

qui potete vedere un esempio:

il progressdialog viene creato e visualizzato e da un filo è chiamato ad eseguire un calcolo pesante:

@Override 
    public void onClick(View v) { 
     pd = ProgressDialog.show(lexs, "Search", "Searching...", true, false); 
     Search search = new Search( ... ); 
     SearchThread searchThread = new SearchThread(search); 
     searchThread.start(); 
    } 

e qui il filo:

private class SearchThread extends Thread { 

     private Search search; 

     public SearchThread(Search search) { 
      this.search = search; 
     } 

     @Override 
     public void run() {   
      search.search(); 
      handler.sendEmptyMessage(0); 
     } 

     private Handler handler = new Handler() { 

      @Override 
      public void handleMessage(Message msg) { 
       displaySearchResults(search); 
       pd.dismiss(); 
      } 
     }; 
    } 
+0

Ho ricostruito la mia app per ottenere questo risultato :) Le esercitazioni che ho letto sembrano essere possibili senza un altro thread, ma non si smette mai di imparare. Non ho finito completamente: ora il ProgressDialog non mostra dove dovrebbe (almeno mostra!), Ma semplicemente "lampeggia" poco prima che i risultati arrivino, ma ora penso di poter fare il resto da solo;) Grazie mille per il vostro aiuto! – Select0r

+2

Solo per completare questo, nel caso qualcuno sia interessato: il "flashing" di ProgressDialog è qualcosa che accade solo nell'emulatore, non si verifica sul dispositivo reale. Sembra che l'emulatore impieghi un paio di secondi prima che la richiesta (onClick) venga effettivamente elaborata e l'app si blocca fino a quando ciò non si verifica. Sul dispositivo, tutto ok. – Select0r

+2

perché non usiamo pd = new ProgressDialog (this); pd.show() ;? – Emerald214

24

Ti sto dando una soluzione per questo, Prova questo .... Prima definire la finestra di dialogo di avanzamento nell'attività prima di onCreate() metodo.

private ProgressDialog progressDialog;

Ora nel metodo oncreate puoi fare clic sul pulsante Qualsiasi su cui cambierai Activit in qualsiasi azione. Basta impostare la barra di avanzamento lì.

progressDialog = ProgressDialog.show(FoodDriveModule.this, "", "Loading..."); 

ora utilizzare thread per Hamndle il Progressbar per visualizzare e nascondere

new Thread() 
{ 
    public void run() 
    { 

    try 
     { 
     sleep(1500); 

    // do the background process or any work that takes time to see progreaa dialog 

     } 
    catch (Exception e) 
    { 
     Log.e("tag",e.getMessage()); 
    } 
// dismiss the progressdialog 
    progressDialog.dismiss(); 
} 
}.start(); 

Questo è tutto!

+0

La sua progress progressization mostra perfettamente. Ma il mio contesto è leggermente diverso. Voglio mostrare progressDialog quando passi da un'applicazione all'altra e vuoi evitare il black-out. È possibile? – YuDroid

3

Ciò è possibile anche utilizzando AsyncTask. Questa classe crea un thread per te. Dovresti creare una sottoclasse e compilare il metodo doInBackground(...).

4

La finestra di dialogo Avanzamento non viene visualizzata perché è necessario utilizzare un thread separato. Le migliori pratiche in Android è utilizzare AsyncTask (altamente consigliato). Vedi anche questo answer.