2011-01-06 38 views
2

我有一個覆蓋擴展有2個對話作爲私人屬性 - 一個對話框和一個ProgressDialog。單擊MapView中的疊加層後,將出現對話框對象。當用戶單擊對話框中的按鈕時,它將消失,並顯示ProgressDialog。同時通過通知正在運行的服務啓動後臺任務。任務完成後,將調用Overlay對象中的方法(buildingLoaded)以切換視圖並關閉ProgressDialog。視圖正在切換,代碼正在運行(我使用調試器進行了檢查),但ProgressDialog未被解除。我也嘗試過hide()和cancel()方法,但沒有任何效果。有人能幫助我嗎? Android版本是2.2執行解除,隱藏或取消後ProgressDialog不會消失?

下面是代碼:

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

您不會向我們展示您創建或顯示overlayDialog的位置。你確定overlayDialog引用了顯示的同一個對話框嗎? – Falmarri 2011-01-06 19:13:57

+0

你對線程也有點模糊。當你開始後臺任務時,你在使用AsyncTask嗎?調用`buildingLoaded`的`AsyncTask`是什麼?那不行。 – 2011-01-06 19:20:24

回答

6

不知道這是你的問題的原因,但你正在呼籲ProgressDialog的方法是static,但你正在調用它的類的一個實例。這裏的方法定義:

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

正如你所看到的,返回一個ProgressDialog的方法,它不會對你的類的實例進行show操作。更新你的代碼中使用其中的一個:

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

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

ProgressDialog.show(...)方法做實際上返回之前執行的對話框上顯示()。這裏是Android.jar源代碼:

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; 
} 

這個方法的所有重載都指向這個。