视图的可见性更改无法以编程方式正常工作

时间:2016-06-16 16:24:05

标签: android android-view visibility

我正在尝试在我的活动中添加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

任何解决方案的人?

2 个答案:

答案 0 :(得分: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 :(得分: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确实有内置的。