web-dev-qa-db-fra.com

Android: ProgressDialog ne s'affiche pas

J'essaie de créer un ProgressDialog pour une application Android (juste une simple montrant à l'utilisateur que des choses se produisent, pas de boutons ou quoi que ce soit), mais je ne peux pas faire les choses correctement. J'ai parcouru des forums et des didacticiels ainsi que l'exemple de code fourni avec le SDK, mais en vain.

Voici ce que j'ai obtenu:

    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 également essayé d'ajouter pd.show(); et j'ai dérangé avec le paramètre dans new ProgressDialog, Ce qui n'a rien donné du tout (sauf les erreurs que le paramètre choisi ne fonctionnera pas), ce qui signifie: le ProgressDialog a gagné ' jamais se présenter. 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 la boîte de dialogue au bon endroit, je l'ai déplacée un peu mais cela n'a pas aidé non plus. Peut-être que je suis dans le mauvais contexte? Le code ci-dessus est à l'intérieur de private ViewGroup _createInputForm() dans MyApp.

Tout indice est apprécié,

38
Select0r

vous devez appeler pd.show avant le début du long calcul, puis le calcul doit s'exécuter dans un thread séparé. Dès que ce thread est terminé, vous devez appeler pd.dismiss () pour fermer la boîte de dialogue prgoress.

ici vous pouvez voir un exemple:

le dialogue de progression est créé et affiché et un thread est appelé pour 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 voici 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();
            }
        };
    }
42

Je vous donne une solution, essayez ceci ... Définissez d'abord la boîte de dialogue de progression dans la méthode Activity before onCreate()

private ProgressDialog progressDialog;

Maintenant, dans la méthode onCreate, vous pouvez avoir le bouton Any cliquer sur lequel vous allez modifier l'activité sur n'importe quelle action. Réglez simplement la barre de progression à cet endroit.

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

Utilisez maintenant le fil pour gérer 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 progress dialog
       }
       catch (Exception e)
       {
           Log.e("tag",e.getMessage());
       }
       // dismiss the progress dialog   
       progressDialog.dismiss();
    }
}.start();

C'est tout!

25
user644458

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

4
lory105

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

3
Peter Stuifzand