How to center progress indicator in ProgressDialog easily (when no title/text passed along) How to center progress indicator in ProgressDialog easily (when no title/text passed along) android android

How to center progress indicator in ProgressDialog easily (when no title/text passed along)


I did some testing and I feel that the best way to achieve this is doing a custom Dialog.

Here is an example of what I did. This will answer question number 2 but will give you an idea of how to fix question number 1.

public class MyProgressDialog extends Dialog {    public static MyProgressDialog show(Context context, CharSequence title,            CharSequence message) {        return show(context, title, message, false);    }    public static MyProgressDialog show(Context context, CharSequence title,            CharSequence message, boolean indeterminate) {        return show(context, title, message, indeterminate, false, null);    }    public static MyProgressDialog show(Context context, CharSequence title,            CharSequence message, boolean indeterminate, boolean cancelable) {        return show(context, title, message, indeterminate, cancelable, null);    }    public static MyProgressDialog show(Context context, CharSequence title,            CharSequence message, boolean indeterminate,            boolean cancelable, OnCancelListener cancelListener) {        MyProgressDialog dialog = new MyProgressDialog(context);        dialog.setTitle(title);        dialog.setCancelable(cancelable);        dialog.setOnCancelListener(cancelListener);        /* The next line will add the ProgressBar to the dialog. */        dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));        dialog.show();        return dialog;    }    public MyProgressDialog(Context context) {        super(context, R.style.NewDialog);    }}

All the static methods comes from this link, nothing strange, but the magic occurs in the constructor.Check that I pass as parameter an style. That style is the following:

<?xml version="1.0" encoding="utf-8"?><resources>    <style name="NewDialog" parent="@android:Theme.Dialog">        <item name="android:windowFrame">@null</item>        <item name="android:windowBackground">@android:color/transparent</item>        <item name="android:windowIsFloating">true</item>        <item name="android:windowContentOverlay">@null</item>        <item name="android:windowTitleStyle">@null</item>        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>        <item name="android:backgroundDimEnabled">false</item>        <item name="android:background">@android:color/transparent</item>    </style></resources>

The result of this is a ProgressBar rotating in the center of the screen. Without backgroundDim and without the Dialog box.


Easy and customizable way:

Define animation:(res/drawable/loader_anim.xml)

<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@drawable/image_for_rotation"android:pivotX="50%"android:pivotY="50%" />

or:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" ><itemandroid:drawable="@drawable/img_loader_frame1"android:duration="150"/>...<itemandroid:drawable="@drawable/img_loader_frame2"android:duration="150"/>...</animation-list>

then, define layout: (res/layout/loader.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/layout_root"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_gravity="center_vertical|center_horizontal"> <ProgressBarandroid:layout_width="200dp"android:layout_height="200dp"android:indeterminateDrawable="@drawable/loader_anim" /></LinearLayout>

and then, instance progress dialog:

ProgressDialog dialog;...dialog = ProgressDialog.show(this,null,null);dialog.setContentView(R.layout.loader);...process();...dialog.dismiss();

More info:


I use the following, it requires no layout file, and puts a centered, borderless blocking progress bar in the middle of the screen.

private ProgressDialog progressDialog;setUIToWait(true);...long process...setUIToWait(false);private void setUIToWait(boolean wait) {    if (wait) {        progressDialog=ProgressDialog.show(this,null,null);        progressDialog.setContentView(new ProgressBar(this));    } else {        progressDialog.dismiss();    }}