40

我正在尝试为 Android 应用程序创建一个 ProgressDialog(只是一个简单的向用户显示正在发生的事情,没有按钮或任何东西),但我无法做到正确。我浏览过论坛和教程以及 SDK 附带的示例代码,但无济于事。

这就是我得到的:

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

我还尝试添加pd.show();和弄乱参数,new ProgressDialog结果什么都没有(除了所选参数不起作用的错误),这意味着:ProgressDialog 永远不会出现。该应用程序一直在运行,就好像我从未添加过对话框一样。

我不知道我是否在正确的位置创建对话框,我将它移动了一下,但这也没有帮助。也许我在错误的上下文中?private ViewGroup _createInputForm()上面的代码在里面MyApp

任何提示表示赞赏,

4

4 回答 4

42

您必须在长计算开始之前调用 pd.show ,然后计算必须在单独的线程中运行。一旦这个线程完成,你必须调用 pd.dismiss() 来关闭 prgoress 对话框。

在这里你可以看到一个例子:

进度对话框被创建和显示,并调用一个线程来运行一个繁重的计算:

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

这里是线程:

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();
            }
        };
    }
于 2010-05-09T17:09:02.190 回答
25

我给你一个解决方案,试试这个...首先在Activity beforeonCreate()方法中定义Progress Dialog

private ProgressDialog progressDialog;

现在在该onCreate方法中,您可能会单击任何按钮,您将在任何操作上更改活动。只需在此处设置进度条。

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

现在使用线程来处理进度条来显示和隐藏

new Thread() 
{
    public void run() 
   {
       try
       {
           sleep(1500); 
           // do the background process or any work that takes time to see progress dialog
       }
       catch (Exception e)
       {
           Log.e("tag",e.getMessage());
       }
       // dismiss the progress dialog   
       progressDialog.dismiss();
    }
}.start();

就这些!

于 2011-04-12T06:24:14.270 回答
4

进度对话框不显示,因为您必须使用单独的线程。Android 中的最佳实践是使用AsyncTask(强烈推荐)。另请参阅此答案

于 2012-08-27T07:59:47.863 回答
3

这也可以通过使用AsyncTask来实现。此类为您创建一个线程。您应该对其进行子类化并填写doInBackground(...)方法。

于 2012-08-16T16:05:56.393 回答