Search code examples
javaandroidmultithreadinguser-interfacerunnable

Creating a progress bar for android


Hi I am new to threading in general and I am trying to set up a progress bar that increments itself every half-second up to 100 using the sleep method. I have been having trouble using a lot of the syntax I have found on line and when I launch this program it does not display a progress bar but instead displays a spinning loading icon. This is what I have:

public class main extends ActionBarActivity {
Handler mHandler;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final Button startButton = (Button) findViewById(R.id.startbutton);

    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(1);
            startPb();
        }
    });
}
private void startPb(){

    final ProgressBar pb = (ProgressBar) findViewById(R.id.progressBar);
    pb.setIndeterminate(false);
    pb.setProgress(0);
    new Thread(new Runnable(){

        public void run(){
            for (int i = 0; i <= 100; i++)
                try {
                    Thread.sleep(500);
                    pb.setProgress(i);
                    System.out.println(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            pb.post(new Runnable() {
                public void run() {
                    pb.incrementProgressBy(1);
                }
            });

        }
    }).start();
}

I have a feeling I am not implementing the progress bar properly in the above code. Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".Counter"
android:id="@+id/counter"
tools:ignore="InvalidId">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="startButton"
    android:id="@+id/startbutton"
    android:layout_centerHorizontal="true" />

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:layout_below="@+id/startbutton"
    android:layout_centerHorizontal="true" />

</RelativeLayout>

Solution

  • A spinning progress bar is an indeterminate progress bar. To use an actual progress bar you will want to call:

    pb.setIndeterminate(false);
    

    The progress bar style was also an issue. Here is a good reference explaining progress bar style types. What's the meaning of android:progressBarStyle attribute in ProgressBar?