2016-06-16 66 views
0

我正在尝试在我的活动中添加progressBar。在布局XML文件中,我为progressBar和显示进度级别的textView设置了android:visibility =“gone”。我想按下一个按钮并使用progressBar和textview visibility =“visible”开始一个进程,然后在进程结束后再次隐藏它们。视图的可见性更改无法通过编程方式正常工作

这是我的按钮代码。 enter image description here

问题是,当我按下发现按钮,什么都没有显示! 当我在Log.e(“visibilty”,“GONE”)之前删除两行时,视图只有在过程结束后才可见。看起来setVisibility指令是在While循环很奇怪之后执行的。

enter image description here

任何解决方案的家伙?

+0

请勿将图像形式的代码发布。始终将其复制到问题本身中。如果您担心保持代码格式化,请参阅StackOverflow的Markdown规则[此处](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(){ @覆盖 公共无效的onClick(视图v){ 采样任务=新样品(); task.onPreExecute() ; task.doInBackground(); } }); 但它不处理onPostExecute()方法。结果进度条和textView在处理结束后保持可见。 任何线索来解决这个问题? – libhu

0

如果您想在延迟后运行一些代码,您可以使用Handler + Runnable而不是睡眠主线程。

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

上调用'execute'谢谢!我已经尝试过这个解决方案,但经过一段时间的过程后,它引发了一个致命的错误:android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触及其视图。 – libhu

+0

这就是我放弃处理程序/ Runnable解决方案并使用经典While循环和thread.sleep指令切换到主线程的原因。 – libhu

+0

哦,那么你需要在Runnable里面增加一个'runOnUiThread'。无论如何,绝对不要睡主线。 –

相关问题