Using the "animated circle" in an ImageView while loading stuff Using the "animated circle" in an ImageView while loading stuff android android

Using the "animated circle" in an ImageView while loading stuff


Simply put this block of xml in your activity layout file:

<RelativeLayout    android:id="@+id/loadingPanel"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center" >    <ProgressBar        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:indeterminate="true" /></RelativeLayout>

And when you finish loading, call this one line:

findViewById(R.id.loadingPanel).setVisibility(View.GONE);

The result (and it spins too):

enter image description here


You can do this by using the following xml

<RelativeLayout    style="@style/GenericProgressBackground"    android:id="@+id/loadingPanel"    >    <ProgressBar        style="@style/GenericProgressIndicator"/></RelativeLayout>

With this style

<style name="GenericProgressBackground" parent="android:Theme">    <item name="android:layout_width">fill_parent</item>        <item name="android:layout_height">fill_parent</item>    <item name="android:background">#DD111111</item>        <item name="android:gravity">center</item>  </style><style name="GenericProgressIndicator" parent="@android:style/Widget.ProgressBar.Small">    <item name="android:layout_width">wrap_content</item>    <item name="android:layout_height">wrap_content</item>    <item name="android:indeterminate">true</item> </style>

To use this, you must hide your UI elements by setting the visibility value to GONE and whenever the data is loaded, call setVisibility(View.VISIBLE) on all your views to restore them. Don't forget to call findViewById(R.id.loadingPanel).setVisiblity(View.GONE) to hide the loading animation.

If you dont have a loading event/function but just want the loading panel to disappear after x seconds use a Handle to trigger the hiding/showing.


This is generally referred to as an Indeterminate Progress Bar or Indeterminate Progress Dialog.

Combine this with a Thread and a Handler to get exactly what you want. There are a number of examples on how to do this via Google or right here on SO. I would highly recommend spending the time to learn how to use this combination of classes to perform a task like this. It is incredibly useful across many types of applications and will give you a great insight into how Threads and Handlers can work together.

I'll get you started on how this works:

The loading event starts the dialog:

//maybe in onCreateshowDialog(MY_LOADING_DIALOG);fooThread = new FooThread(handler);fooThread.start();

Now the thread does the work:

private class FooThread extends Thread {    Handler mHandler;    FooThread(Handler h) {        mHandler = h;    }    public void run() {         //Do all my work here....you might need a loop for this        Message msg = mHandler.obtainMessage();        Bundle b = new Bundle();                        b.putInt("state", 1);           msg.setData(b);        mHandler.sendMessage(msg);    }}

Finally get the state back from the thread when it is complete:

final Handler handler = new Handler() {    public void handleMessage(Message msg) {        int state = msg.getData().getInt("state");        if (state == 1){            dismissDialog(MY_LOADING_DIALOG);            removeDialog(MY_LOADING_DIALOG);        }    }};