Android:ProgressDialog不显示

时间:2010-05-09 17:07:07

标签: android progressdialog android-context

我正在尝试为Android-App创建一个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 个答案:

答案 0 :(得分:42)

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

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

创建并显示progressdialog,并调用一个线程来运行繁重的计算:

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

答案 1 :(得分:25)

我给你一个解决方案, 试试这个... 首先在onCreate()方法

之前定义活动中的进度对话框
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();

就是这样!

答案 2 :(得分:4)

进度对话框未显示,因为您必须使用分离的线程。 Android中的最佳做法是使用AsyncTask(强烈推荐)。 另请参阅此answer

答案 3 :(得分:3)

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