ProgressDialog are used to show progress of a task. For example, when you are uploading or downloading something from the internet, it is better to show the progress of download/upload to the user.
Android ProgressDialog is an extension of AlertDialog and has been available since API 1. It's simple to use, but keep this statement in mind (from the Android Dialog Guidelines site):
Android includes another dialog class called ProgressDialog that shows a dialog with a progress bar. However, if you need to indicate loading or indeterminate progress, you should instead follow the design guidelines for Progress & Activity and use a ProgressBar in your layout. Source
This message doesn't mean the ProgressDialog is deprecated or is bad code. It's suggesting that the use of the ProgressDialog should be avoided, since the user cannot interact with your app while the dialog is displayed. If possible, use a layout that includes a progress bar, instead of using a ProgressDialog (like in Google Play).
Some important attributes of android ProgressDialog are given below.
setMessage() method is used to show the message to the user.setTitle() method is used to set a title to the dialog box.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) method is used to show the horizontal progress bar in the dialog box.setProgressStyle(ProgressDialog.STYLE_SPINNER) method is used to show the circle/spinning progress bar in the dialog box.setMax() method is used to set the maximum value.getProgress() method is used to get the current progress value in numbers.getMax() method returns the maximum value of the progress.show(Context context, CharSequence title, CharSequence message) method is a static method, used to display progress dialog.incrementProgressBy(int diff) method increments the progress bar by the difference of value passed as a parameter.I will demonstrate both the Ring and the Bar style of the ProgressDialog component.
Indeterminate dialog indicator
Since this is just a demonstration on using the ProgressDialog, we will create a button to show the dialog. To simulate some long task, we will use a delayed message to dismiss the dialog. To start, open activity_main.xml and add following snippet
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Dialog" android:id="@+id/button" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:onClick="showProgress"/>
Open MainActivity.java and add the following
public void showProgress(View view) {
final int THREE_SECONDS = 3*1000;
final ProgressDialog dlg = new ProgressDialog(this);
dlg.setMessage("Doing something...");
dlg.setCancelable(false);
dlg.show();
new Handler().postDelayed(new Runnable() {
public void run() {
dlg.dismiss();
}
}, THREE_SECONDS);
}
Normally, a dialog can be cancelled using the back key, but when setCancelable is set to false, the user is stuck on the dialog until it is hidden/dismissed from the code.
Determinate dialog indicator
We used the default ProgressDialog settings in previous example, which creates an indeterminate dialog indicator, for example, the continuously spinning circle. If you can measure the task at hand, such as loading files, you can use a determinate style instead
dlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
I'm going to show how to use AsyncTask and ProgressDialog in union for long running task. Add following snippet to MainActivity
private ProgressDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showProgress(View view) {
LoadPage task = new LoadPage(this);
String[] urls = {"http://proft.me"};
task.execute(urls);
}
private class LoadPage extends AsyncTask<String, Integer, String> {
private Context ctx;
public LoadPage (Context context){
ctx = context;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mDialog = new ProgressDialog(ctx);
mDialog.setMessage("Doing something...");
mDialog.setCancelable(false);
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.show();
}
@Override
protected String doInBackground(String... urls) {
int indx = 0;
try {
while (indx < 100) {
indx += 10;
publishProgress(indx);
Thread.sleep(200);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onProgressUpdate(Integer... progress) {
mDialog.setProgress(progress[0]);
}
@Override
protected void onPostExecute(String result) {
mDialog.dismiss();
Toast.makeText(MainActivity.this, "Page loaded", Toast.LENGTH_SHORT).show();
}
}
You will get the following dialog style as an output to the preceding line of code
How to show an indeterminate ProgressBar
<ProgressBar
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:indeterminateOnly="true"
android:indeterminateTint="@color/colorPrimary"
android:layout_centerInParent="true"/>
There are attributes
android:indeterminate Allows to enable the indeterminate mode.android:indeterminateBehavior Defines how the indeterminate mode should behave when the progress reaches max.android:indeterminateDrawable Drawable used for the indeterminate mode.android:indeterminateDuration Duration of the indeterminate animation.android:indeterminateOnly Restricts to ONLY indeterminate mode (state-keeping progress mode will not work).android:indeterminateTint Tint to apply to the indeterminate progress indicator.android:indeterminateTintMode Blending mode used to apply the indeterminate progress indicator tint. Programmatically setting the progress bar indeterminate mode
pb.setIndeterminate(true);
Other methods related to progress bar indeterminate mode
setIndeterminateDrawable(Drawable d) Define the drawable used to draw the progress bar in indeterminate mode.setIndeterminateDrawableTiled(Drawable d) Define the tileable drawable used to draw the progress bar in indeterminate mode.setIndeterminateTintList(ColorStateList tint) Applies a tint to the indeterminate drawable.setIndeterminateTintMode(PorterDuff.Mode tintMode) Specifies the blending mode used to apply the tint specified bysetIndeterminateTintList(ColorStateList) to the indeterminate drawable. How to change color of ProgressBar
For Android 5.0 and above add following attributes to the layout
android:indeterminateTint="@color/colorRed" android:indeterminateTintMode="src_in"
For lower version I use this
progressBar.getIndeterminateDrawable().setColorFilter(getResources() .getColor(R.color.colorRed),PorterDuff.Mode.SRC_IN);
Useful links