2011-01-06 85 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; 
} 

这个方法的所有重载都指向这个。