从onClick内部更改ProgressBar可见性

时间:2014-04-06 19:28:26

标签: android onclick visibility android-progressbar

我的activity_main.xml包含这个progressBar,它开始隐藏("消失了#34;)

<ProgressBar
       android:id="@+id/progressBar_sendingPhoneNumber"
       style="?android:attr/progressBarStyleLarge"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_below="@id/button_sendPhoneNumber"
       android:layout_centerInParent="true"
       android:visibility="gone" />

我的MainActivity.java有这个,
我有一个按钮的onClick处理程序

    final Context context = this;

    sendPhoneNumberButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar_sendingPhoneNumber);
            progressBar.setVisibility(View.VISIBLE);

            // Simulate HTTP connection
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            progressBar.setVisibility(View.GONE);

            // Redirect to new activity
            Intent intent = new Intent(context, InboxActivity.class);
            startActivity(intent);
        }
    });

问题是进度条永远不会显示,尽管执行onClick代码(例如,它最终被重定向到新活动)。这一行:

progressBar.setVisibility(View.VISIBLE);

不会生效。

我认为这与上下文有关,并试图改变来自&#34;外部&#34;的进度条的可见性。活动,但我不确定。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

它永远不会显示,因为你正在调用

try {
    Thread.sleep(3000);
 } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

使得&#34;睡眠&#34;负责绘制您试图显示的同一ProgressBar的线程

答案 1 :(得分:3)

在UI线程上调用Thread.sleep(3000);将阻止UI线程。你不应该阻止UI线程。

http://developer.android.com/training/articles/perf-anr.html

  

如果您实现Thread或HandlerThread,请确保您的UI线程   在等待工作线程完成时不阻塞 - 不要   调用Thread.wait()或Thread.sleep()

另外,你可以移动它:

ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar_sendingPhoneNumber);

View.onClick之外。每次单击Button时都无需初始化视图。