2011-01-06 7 views
2

Ich habe eine Overlay-Erweiterung, die zwei Dialoge als private Attribute hat - einen Dialog und einen ProgressDialog. Nach dem Klicken auf die Überlagerung in der MapView wird das Dialogfeld Objekt angezeigt. Wenn der Benutzer auf eine Schaltfläche im Dialog klickt, verschwindet er und der ProgressDialog wird angezeigt. Gleichzeitig wird eine Hintergrundaufgabe gestartet, indem ein laufender Dienst benachrichtigt wird. Wenn die Aufgabe erledigt ist, wird eine Methode (buildingLoaded) im Overlay-Objekt aufgerufen, um die Ansicht zu wechseln und den ProgressDialog zu schließen. Die Ansicht wird umgeschaltet, der Code wird ausgeführt (ich habe das mit dem Debugger überprüft), aber der ProgressDialog wird nicht beendet. Ich habe auch hide() und cancel() Methoden versucht, aber nichts funktioniert. Kann mir jemand helfen? Android-Version ist 2.2ProgressDialog verschwindet nicht nach dem Ausführen von ablehnen, verstecken oder abbrechen?

Hier ist der Code:

public class LODOverlay extends Overlay implements OnClickListener { 



private Dialog overlayDialog; 

private ProgressDialog progressDialog; 

     .............. 


@Override 
public void onClick(View view) { 

        ....... 

     final Context ctx = view.getContext(); 
     this.progressDialog = new ProgressDialog(ctx); 
     ListView lv = new ListView(ctx); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(ctx, R.layout.layerlist, names); 
     lv.setAdapter(adapter); 
     final LODOverlay obj = this; 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
       String name = ((TextView) view).getText().toString(); 
     Intent getFloorIntent = new Intent(Map.RENDERER); 
     getFloorIntent.putExtra("type", "onGetBuildingLayer"); 
     getFloorIntent.putExtra("id", name); 
     view.getContext().sendBroadcast(getFloorIntent); 
     overlayDialog.dismiss(); 

     obj.waitingForLayer = name; 

     progressDialog.show(ctx, "Loading...", "Wait!!!"); 


      } 
     }); 

    ....... 
} 


public void buildingLoaded(String id) { 
    if (null != this.progressDialog) { 
     if (id.equals(this.waitingForLayer)) { 
      this.progressDialog.hide(); 
      this.progressDialog.dismiss(); 

    ............ 

      Map.flipper.showNext(); // changes the view 
     } 
    } 
} 

}

+0

Sie zeigen uns nicht, wo Sie den OverlayDialog erstellen oder anzeigen. Sind Sie sicher, dass overlayDialog auf denselben Dialog verweist, der angezeigt wird? – Falmarri

+0

Sie sind auch ein wenig vage über Threading. Wenn Sie eine Hintergrundaufgabe starten, verwenden Sie AsyncTask? Ist 'AsyncTask', wo' buildingLoaded' aufgerufen wird? Das würde nicht funktionieren. –

+0

overlayDialog funktioniert gut - der progressDialog ist das Problem. – Martin

Antwort

6

Nicht sicher, ob dies die Ursache für das Problem ist, aber die Methode, die Sie auf ProgressDialog nennend ist static, aber Sie rufen es für eine Instanz der Klasse auf. Hier ist die Methode Definition:

public static ProgressDialog show (Context context, CharSequence title, CharSequence message) 

Wie Sie sehen können, wobei das Verfahren gibt ein ProgressDialog, ist es nicht den show Betrieb auf Ihrer Instanz der Klasse durchzuführen. Aktualisieren Sie Ihren Code eine davon zu verwenden:

progressDialog.setTitle("Loading..."); 
progressDialog.setMessage("Wait!!!"); 
progressDialog.show(); 

oder

progressDialog = ProgressDialog.show(ctx, "Loading...", "Wait!!!"); 
+0

Vielen Dank !!! PERFEKT !!! – Martin

2

ProgressDialog.show (...) Methoden in der Tat eine Show durchführen() im Dialog, bevor er zurückkehrt. Hier ist Android.jar Quelle:

public static ProgressDialog show(Context context, CharSequence title, 
     CharSequence message, boolean indeterminate, 
     boolean cancelable, OnCancelListener cancelListener) { 
    ProgressDialog dialog = new ProgressDialog(context); 
    dialog.setTitle(title); 
    dialog.setMessage(message); 
    dialog.setIndeterminate(indeterminate); 
    dialog.setCancelable(cancelable); 
    dialog.setOnCancelListener(cancelListener); 
    dialog.show(); 
    return dialog; 
} 

Alle Überlastungen dieser Methode beziehen sich auf diese.