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