【问题标题】:ProgressDialog does not disappear after executing dismiss, hide or cancel?ProgressDialog在执行dismiss、hide或cancel后不消失?
【发布时间】:2011-01-06 19:07:06
【问题描述】:

我有一个覆盖扩展,它有 2 个作为私有属性的对话框 - 一个对话框和一个 ProgressDialog。单击 MapView 中的 Overlay 后,将出现 Dialog 对象。当用户单击对话框中的按钮时,它会消失并显示 ProgressDialog。同时通过通知正在运行的服务启动后台任务。任务完成后,调用 Overlay 对象中的方法(buildingLoaded)来切换 View 并关闭 ProgressDialog。视图正在切换,代码正在运行(我用调试器检查过),但 ProgressDialog 没有被关闭。我也尝试了 hide() 和 cancel() 方法,但没有任何效果。有人可以帮助我吗? 安卓版本是2.2

代码如下:

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

}

【问题讨论】:

  • 您没有向我们展示您在哪里创建或显示overlayDialog。你确定 overlayDialog 引用的是同一个对话框吗?
  • 你对线程也有点模糊。当您启动后台任务时,您使用的是 AsyncTask 吗? AsyncTask 是调用buildingLoaded 的地方吗?那是行不通的。
  • overlayDialog 工作正常 - progressDialog 是问题所在。
  • 好的,下面是项目的基本结构: 主Activity(MapActivity)启动一个Service作为后台任务运行。当用户与地图交互时,一些消息通过 Intents 发送到 Service,并加载和处理一些 XML 数据。处理完数据后,会向主 Activity 发送一个 Intent,该 Activity 会找到 Overlay 并调用该叠加层的 buildingLoaded() 方法。我几乎可以肯定,引用了正确的对象,因为我现在只有一个。

标签: android progressdialog


【解决方案1】:

不确定这是否是您的问题的原因,但您在 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(...) 方法实际上在返回之前对对话框执行 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;
    }
    

    这个方法的所有重载都引用这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2016-10-31
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      相关资源
      最近更新 更多