2012-11-08 8 views
9

ために、私は合理的に長い実行中の更新プロセスを処理するためのAsyncTaskを持っている、と私は示し進捗ダイアログをしたい:確定ダイアログと不確定の間の進行状況ダイアログを切り替えるにはどうすればよいですか?

  1. (簡単な秒間)、「更新開始」
  2. 「更新のダウンロード」 (何のプログレスバー—は、私はそれをダウンロードする前に、更新がされますどのように大きなわからない)
  3. (0〜100%のプログレスバー付き)、「更新データの保存」を
  4. で(「更新画像を保存」 0〜100%進行状況バー)
  5. "更新が完了しました"(brダイアログが消える前の秒数)

確定(進行状況バーが表示される)と不確定(進行状況が表示されない)の間で進行状況ダイアログを切り替える際に問題があります。

私のAsyncTaskのコードは次のとおりです。

private final ProgressDialog progressDialog; 

public SynchronizeTask(Activity activity) 
{ 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

protected void onPreExecute() { 
    progressDialog.setMessage("Starting update..."); 
    progressDialog.setCancelable(false); 
    progressDialog.show(); 
} 

...lots of code here... 

// all of these are set from doInBackground() 
private String progressMsg; 
private int progressTotal; 
private int progressProgress; 

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setMax(0); 
     progressDialog.setProgress(0); 
    } 
} 

を私はここsetIndeterminate() —の問題を確定するトグルしようとしたにもかかわらず、進行状況ダイアログ・ショー「はNaN」とダイアログ下部の「0%」ということです不確定モードでは「バー」は残っていません。

setProgressNumberFormat()setProgressPercentFormat()を使用して数字—を隠してみましたが、どちらもAndroid 3.0ではサポートされていません。

は、その後、私は私のonProgressUpdate()setProgressStyle()を呼び出しSTYLE_SPINNERとSTYLE_HORIZONTAL —切り替えることsetProgressStyle()を使用してみました私のアプリがクラッシュするようです。

確定モードと不確定モードの間で進行状況ダイアログを簡単に切り替える方法はありますか?

答えて

3

進捗ダイアログを閉じて別のスタイルを使用して別のダイアログを開くことをお勧めします。

+1

OK、 - 私は「オンザフライ」ProgressDialogを再作成することができないであろうと想定のだが、それはように見えますonProgressUpdate()がUIスレッド上で実行されているのでうまく動作します。更新の新しい "フェーズ"ごとにブール値フラグ "newDialog"を設定し、そのフラグが私のonProgressUpdate()にセットされているのを見たら私は古いダイアログを閉じます。選択したスタイル(スピナーまたは水平)で新しいダイアログを作成します。新しいダイアログを表示する。 newDialogをfalseに戻します。先端に感謝します。 – George

-1

あなたは、このようにコードを変更することができます動作するようです

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setProgressNumberFormat("%1d/%2d"); 
     progressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance()); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setProgressNumberFormat(null); 
     progressDialog.setProgressPercentFormat(null); 
    } 
} 
関連する問題