2016-06-16 11 views
0

私は自分のアクティビティにprogressBarを追加しようとしています。レイアウトXMLファイルでは、progressBarとtextViewの両方に対してアンドロイド:visibility = "gone"を設定し、進行状況を表示します。私は、ボタンを押して、progressBarとtextview visibility = "visible"のプロセスを開始し、プロセスが終了した後に再び非表示にしたいと思います。ビューの可視性の変更がプログラム的にうまく機能しない

これは私のボタンコードです。 enter image description here

問題は、私が発見ボタンを押すと何も表示されないことです! Log.e( "visibilty"、 "GONE")の前に2行を削除すると、ビューはプロセスの終了後にのみ表示されます。 setVisibility命令はWhile Loopの後で実行されるようですが、それはとても奇妙です。

enter image description here

どれソリューションの男?

+0

画像形式でコードを投稿しないでください。常にそれを質問自体にコピーしてください。あなたのコードをフォーマットすることを心配しているのであれば、StackOverflowのMarkdownルール[here](https://stackoverflow.com/help/formatting)を見てください。 – computerfreaker

答えて

0

メインUIスレッドの遅延を使用してUIを変更しようとしています。これは期待どおりに動作しません。これにはAsyncTaskを使用して、ビューを更新し、最後に非表示にすることができます。

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

    @Override 
    protected String doInBackground(String... params) { 
     //Do in background, NO UI HERE 
     for (int i = 0; i < 100; i++) { 
      try { 
       Thread.sleep(1000); 
       this.publishProgress(); //Call onProgressUpdate 
      } catch (InterruptedException e) { 
       Thread.interrupted(); 
      } 
     } 
     return "Finished!"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     //After it's completed, touch UI here 
    } 

    @Override 
    protected void onPreExecute() { 
     //Before it starts, touch UI here 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     //Update text here, touch UI here 
    } 
} 
+1

私はそれほど遠くに行きません。ハンドラはすべてのOPのニーズに対応する必要があります。 –

+0

彼の特別なケースに同意するビット過度かもしれない –

+0

ありがとう。それは私がこのようにそれをやった、かなり良い作品: discover.setOnClickListener(新View.OnClickListener(){@Override ます。public void onClickの(ビューV){ サンプルタスク=新しいサンプル(); task.onPreExecute() ; task.doInBackground(); } }); しかし、onPostExecute()メソッドは処理されません。結果として、プログレスバーとtextViewは、プロセスが終了した後でも表示されたままです。 その問題を解決する手掛かりはありますか? – libhu

0

遅れてコードを実行したい場合は、メインスレッドをスリープさせる代わりにハンドラ+実行可能ファイルを使用できます。

final Handler handler = new Handler(); 
Runnable hideRunnable = new Runnable() { 
    @Override 
    public void run() { 
    // Your visibility logic 
    } 
}; 
handler.postDelayed(hideRunnable, 190); // 190 milliseconds 

Updating a ProgressBar with a Handlerについていくつかの議論があります。進捗追跡が必要な場合、AsyncTaskにはその組み込み関数があります。

+0

ありがとう!私はすでにこの解決策を試しましたが、ちょっとしたプロセスの後、致命的なエラーが表示されてしまいました:android.view.ViewRootImpl $ CalledFromWrongThreadException:ビュー階層を作成した元のスレッドだけがそのビューに触れることができます。 – libhu

+0

これが私がハンドラ/実行可能なソリューションを放棄し、古典的なWhileループとthread.sleep命令でメインスレッドに切り替えた理由です。 – libhu

+0

ああ、Runnableの中に追加の 'runOnUiThread'が必要でした。いずれにせよ、間違いなくメインスレッドをスリープ状態にしないでください。 –

関連する問題