web-dev-qa-db-ja.com

Android:ProgressDialogが表示されない

私は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は今までに表示されます。ダイアログを追加したことがないかのように、アプリは実行を続けます。

適切な場所でダイアログを作成しているかどうかわかりません。少し移動しましたが、それも助けにはなりませんでした。たぶん私は間違った文脈にいますか?上記のコードは、MyAppprivate ViewGroup _createInputForm()内にあります。

ヒントをいただければ幸いです

38
Select0r

長い計算を開始する前に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();
            }
        };
    }
42

私はあなたにそれに対する解決策を与えています、これを試してください...最初にonCreate()メソッドの前にアクティビティで進捗ダイアログを定義します

private ProgressDialog progressDialog;

onCreateメソッドでは、任意のアクションでアクティビティを変更する[Any]ボタンをクリックできます。そこにプログレスバーを設定するだけです。

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

それだけです!

25
user644458

分離されたスレッドを使用する必要があるため、Progress Dialogは表示されません。 Androidのベストプラクティスは、 AsyncTask (強く推奨)を使用することです。これも参照してください answer

4
lory105

これは AsyncTask を使用することでも可能です。このクラスはスレッドを作成します。サブクラス化し、doInBackground(...)メソッドに入力する必要があります。

3
Peter Stuifzand