2011-04-14 81 views
2


是否有可能在动态(而不是从UI线程)上更改PD的样式,消息和标题?

我想要做以下事情。拳头时间PD显示在STYLE_SPINNER,因为它看起来像无尽的进步,并显示消息通知用户该应用程序正在看4东西(某些更新4实例)。当它发现它需要做些什么(安装它)。在这一点上,我想要展示HORIZONTAL样式的PD,因为它确实显示了进度状态,而不是微调样式。ProgressDialog的风格,标题和消息可以随时更改吗?

无论如何,我尝试PD.setMax()时得到NullPointerException。 PD不是空的,所以我不能得到正在发生的事情。

这是在我的活动类的内部类:

private class RestoreDBTask extends AsyncTask <Void, Void, String> 
    { 

     private ProgressDialog dialog; 

     private Handler handler; 

     @Override 
     protected void onPreExecute() 
     { 

      this.dialog = new ProgressDialog(SplashActivity.this); 
      this.dialog.setTitle(getString(R.string.progress_wait)); 
      this.dialog.requestWindowFeature(Window.FEATURE_PROGRESS); 
//   this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      this.dialog.setProgress(0); 
      this.dialog.show(); 

      handler = new Handler() { 
       @Override 
       public void handleMessage(Message msg) { 
        RestoreDBTask.this.dialog.hide(); 

        switch (msg.what) { 
        case 0:{ 
         RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
         break; } 
        case 1: { 
         RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
         break; } 
        case -1: { 
         RestoreDBTask.this.dialog.setMessage(getResources().getString(R.string.progress_db_installing)); 
         break; } 
        case -2: { 
         RestoreDBTask.this.dialog.incrementProgressBy(1); 
         break; } 
        default: { 
         Log.i(APP_TAG,""+RestoreDBTask.this.dialog.getMax()); 
         RestoreDBTask.this.dialog.setMax(msg.what); } 
        } 

        RestoreDBTask.this.dialog.show(); 
       } 
      }; 
     } 

     @Override 
     protected String doInBackground(Void... params) 
     { 
      mDBHelper.initDB(dialog,handler); 
      return ""; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      dialog.dismiss(); 
      startNextActivity(); 
     } 
    } 

一些INT值假定如果msg.what> 1是最大值的mDBHelper.initDB()方法使用handler.sendEmptyMessage()调用为PD。
此外,我不明白为什么PD不显示进度状态,如果它的风格是STYLE_SPINNER?如果我将其更改为STYLE_HORIZONTAL,它可以正常工作...

回答

1

是否可以更改PD的样式,消息和标题(而不是从UI线程)?

无法在另一个Thread中更新UI内容。你应该做的是重写onProgressUpdate(),那里你可以更新UI,而doInBackground()中的代码仍在处理中。

示例代码:

@Override 
protected String doInBackground(Void... params) { 

    // Use publishProgress() to update the UI thread from 
    // a working background process. 

    // If you have the initDB in another class you should probably 
    // pass your RestoreDBTask instance to your initDB and call the instance's 
    // makeProgress() method to successfully use publishProgress(). 
    mDBHelper.initDB(dialog, handler, this); 
    return ""; 
} 

@Override 
protected void onProgressUpdate(Integer... params) { 
    // If you gradually should update the ProgressDialog you probably need 
    // an Integer value as argument in this method. 

    // Update the ProgressDialog here. 
} 

public void makeProgress(Integer... params) { 
    publishProgress(params); 
} 
+0

没有保护void onProgressUpdate(Integer ... params)方法来覆盖,但有保护无效onProgressUpdate(Void ... params)方法。所以我不知道接下来会发生什么。如何从int或东西投射到Void? publishProgress方法应该位于哪里?我猜在Activity中?那么链接到ProgressDialog应该创建为Activity的属性?如果在我的mDBHelper我有活动的链接,为什么我不应该使用直接调用,即mDBHelper.mActivity.publishProgress()或mDBHelper.mContext.publishProgress()(我的意思是在initDB()方法)? – Stan 2011-04-14 12:41:51

+0

将'AsynchronousTask '中的第二个类型改为'extends AsyncTask '。 – Wroclai 2011-04-14 12:51:58

+0

好吧,PD链接是什么? – Stan 2011-04-14 13:07:57

6

我遇到了PD的风格不能展会后()被执行方法(但只有B4)被改变,因为是导致NullPointerException异常如果应用程序试图调用SETMAX( )/ setProgress()/增量等方法。此外,即使在使用hide() - > change style-> show()模式的情况下,PD的样式也不会视觉上改变。

我的解决方案是重新创建PD的情况下更改它的样式(从微调到酒吧或顺时针)。但问题是 - 由于相应的方法(getTitle/getMessage)不存在,我无法将现有PD的Title和Message复制到新的PD,并且愚蠢的原因是setter方法确实存在,所以它打破了Java bean规则。他们为什么不提供获得者?

与PD的风格不同,它的标题和消息可以随时更改。