2010-05-09 8 views
35

J'essaie de créer un ProgressDialog pour une application Android (juste un simple montrant l'utilisateur que les choses se passent, pas de boutons ou quoi que ce soit) mais je ne peux pas le faire correctement. J'ai été à travers des forums et des tutoriels ainsi que le Sample-Code qui vient avec le SDK, mais en vain.Android: ProgressDialog ne montre pas

C'est ce que je suis:

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(); 

J'ai aussi essayé d'ajouter pd.show(); et foiré autour avec le paramètre new ProgressDialog résultant en rien du tout (à l'exception des erreurs que le paramètre choisi ne fonctionnera pas), ce qui signifie: le ProgressDialog ne s'affichera jamais. L'application continue de fonctionner comme si je n'avais jamais ajouté la boîte de dialogue.

Je ne sais pas si je crée le dialogue au bon endroit, je l'ai déplacé un peu mais cela, aussi, n'a pas aidé. Peut-être que je suis dans le mauvais contexte? Le code ci-dessus est à l'intérieur private ViewGroup _createInputForm() dans MyApp.

Tout indice est apprécié,

Répondre

39

vous devez appeler pd.show avant le début de long calcul, puis le calcul doit exécuter dans un thread séparé. Aussitôt que ce thread est terminé, vous devez appeler pd.dismiss() pour fermer le dialogue de prgoress.

ici vous pouvez voir un exemple:

le ProgressDialog est créé et affiché et un fil est appelé à exécuter un calcul lourd:

@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(); 
    } 

et ici le fil:

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

J'ai reconstruit avoir de mon application pour y arriver :) Les tutoriels que j'ai lus sonnaient comme c'était possible sans un autre fil, mais vous n'arrêtez jamais d'apprendre. Je n'ai pas complètement fini: maintenant le ProgressDialog ne montre pas où il devrait (au moins ça se voit!), Mais juste "clignote" juste avant que les résultats arrivent, mais maintenant je pense que je peux faire le reste tout seul;) Merci beaucoup pour votre aide! – Select0r

+2

Juste pour compléter ceci, au cas où quelqu'un serait intéressé: le "clignotant" du ProgressDialog est quelque chose qui n'arrive que dans l'émulateur, il ne se produit pas sur le périphérique réel. Il semble que l'émulateur prenne des centaines de secondes avant que la requête (onClick) ne soit traitée et que l'application se bloque jusqu'à ce que cela arrive. Sur l'appareil, tout va bien. – Select0r

+2

pourquoi n'utilisons-nous pas pd = new ProgressDialog (this); pd.show() ;? – Emerald214

24

Je vous donne une solution pour cela, Essayez ceci .... Commencez par définir la boîte de dialogue Progress dans l'activité avant onCreate() méthode.

private ProgressDialog progressDialog; Maintenant, dans la méthode oncreate, vous pouvez cliquer sur le bouton Any pour modifier l'Activit de n'importe quelle action. Réglez simplement la barre de progression ici.

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

maintenant Utilisez du fil à Hamndle la barre de progression pour afficher et masquer

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(); 

C'est tout!

+0

Il montre parfaitement ProgressDialog. Mais mon contexte est un peu différent. Je veux montrer progressDialog lors du passage d'une application à l'autre et que vous voulez éviter le black-out. C'est possible? – YuDroid

3

Ceci est également possible en utilisant AsyncTask. Cette classe crée un fil pour vous. Vous devez le sous-classer et remplir la méthode doInBackground(...).

4

La boîte de dialogue de progression ne s'affiche pas car vous devez utiliser un thread séparé. Les meilleures pratiques dans Android est d'utiliser AsyncTask (fortement recommandé). Voir aussi answer.