2010-05-09 20 views
35

Ich versuche, einen ProgressDialog für eine Android-App zu erstellen (nur eine einfache zeigt dem Benutzer, dass Sachen passiert, keine Tasten oder irgendetwas), aber ich kann es nicht richtig machen. Ich habe Foren und Tutorials sowie den Beispiel-Code, der mit dem SDK geliefert wird, aber vergeblich durch.Android: ProgressDialog zeigt nicht an

Das ist, was ich habe:

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

Ich habe auch versucht pd.show(); und messed um mit dem Parameter in new ProgressDialog was gar nichts hinzugefügt (außer Fehler, dass der gewählte Parameter wird nicht funktionieren), Das bedeutet: Der ProgressDialog wird niemals angezeigt. Die App läuft einfach so weiter, als hätte ich den Dialog nie hinzugefügt.

Ich weiß nicht, ob ich den Dialog am richtigen Ort erstelle, ich habe ihn ein wenig verschoben, aber das hat auch nicht geholfen. Vielleicht bin ich im falschen Kontext? Der obige Code ist innerhalb private ViewGroup _createInputForm() in MyApp.

Jeder Hinweis ist willkommen,

Antwort

39

müssen Sie pd.show vor der langen Berechnung beginnt anrufen und dann muss die Berechnung in einem separaten Thread ausgeführt werden. Sobald dieser Thread beendet ist, müssen Sie pd.dismiss() aufrufen, um den Prgoress-Dialog zu schließen.

hier können Sie sehen, ein Beispiel:

die progressdialog erstellt und angezeigt wird und ein Thread aufgerufen wird, eine schwere Berechnung auszuführen:

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

und hier den Faden:

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

Ich habe neu erstellt von meiner App, um dies zu tun :) Die Tutorials, die ich las klang, wie dies ohne einen anderen Thread möglich war, aber Sie hören nie auf zu lernen. Ich bin noch nicht fertig: jetzt zeigt der ProgressDialog nicht mehr wo er soll (zumindest zeigt es!), Sondern kurz bevor die Ergebnisse kommen, "blitzt", aber jetzt denke ich, dass ich den Rest alleine machen kann;) Vielen dank für Deine Hilfe! – Select0r

+2

Um dies zu vervollständigen, falls jemand interessiert ist: das "Blinken" des ProgressDialogs passiert nur im Emulator, nicht auf dem eigentlichen Gerät. Es scheint so, als ob der Emulator 100 Sekunden braucht, bevor die Anfrage (onClick) bearbeitet wird und die App erstarrt, bis das passiert. Auf dem Gerät alles in Ordnung. – Select0r

+2

warum benutzen wir nicht pd = new ProgressDialog (this); pd.show(); – Emerald214

24

Ich gebe Ihnen eine Lösung dafür, Versuchen Sie dies .... Definieren Sie zunächst den Fortschrittsdialog in der Aktivität vor onCreate() Methode.

privater ProgressDialog progressDialog;

Jetzt in der Oncreate-Methode können Sie die Any-Schaltfläche klicken, auf der Sie die Activit bei jeder Aktion ändern werden. Setzen Sie einfach die Fortschrittsleiste dort.

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

Jetzt Thread Verwenden Sie die Progressbar Hamndle und alle

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

Das ist zur Anzeige verstecken!

+0

Es zeigt progressDialog perfekt. Aber mein Kontext ist etwas anders. Ich möchte progressDialog beim Wechsel von einer Anwendung zur anderen zeigen und Blackout vermeiden. Ist es möglich? – YuDroid

3

Dies ist auch möglich mit AsyncTask. Diese Klasse erstellt einen Thread für Sie. Sie sollten es unterklassifizieren und die doInBackground(...) Methode ausfüllen.

4

Der Fortschrittsdialog wird nicht angezeigt, da Sie einen getrennten Thread verwenden müssen. Die beste Vorgehensweise in Android ist die Verwendung von AsyncTask (sehr empfehlenswert). Siehe auch diese answer.