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

后端 未结 8 770
死守一世寂寞
死守一世寂寞 2020-11-28 00:43

When calling progressDialog = ProgressDialog.show(this, null, null, true); usually the developers wants to only show the progress indication image, and usually

相关标签:
8条回答
  • 2020-11-28 01:04

    You can always add one ProgressBar in all your activities where you might want to show centered ProgressDialog. Use following in acitivity.xml As:

    <ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:id="@+id/progressBar"
    android:layout_centerInParent="true"
    android:visibility="gone"/>
    

    In your Acitivity.java, use

    ProgressBar bar = new Progress();
    bar = (ProgressBar) findViewById(R.id.progressBar);
    

    Now when you want to show the ProgressBar, just set its visibility to visible, and to cancel, set visibility to gone.

    bar.setVisibility(View.VISIBLE);
    bar.setVisibility(View.GONE);
    
    0 讨论(0)
  • 2020-11-28 01:05

    If you want to display indeterminate progress bar only.

    ProgressDialog progressDialog = ProgressDialog.show(this, null, null, true, false);
    progressDialog.setContentView(R.layout.progress_layout);
    

    And create a layout xml file with name "progress_layout.xml"

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    
    </LinearLayout>
    
    0 讨论(0)
  • 2020-11-28 01:06

    Just Do The Below Method To Get It Done

    In res->values->styles add the below code

    <style name="MyGravity" parent="android:Theme.Material.Dialog" ></style>
    

    Then create yours ProgressDialog as mentioned below

    ProgressDialog dialog = new ProgressDialog(ctx, R.style.MyGravity);
    dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
    
    0 讨论(0)
  • 2020-11-28 01:08

    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.

    0 讨论(0)
  • 2020-11-28 01:12

    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" >
    <item
    android:drawable="@drawable/img_loader_frame1"
    android:duration="150"/>
    ...
    <item
    android: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"> 
    <ProgressBar
    android: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:

    0 讨论(0)
  • 2020-11-28 01:22

    Using ProgressBar and adding it to LinearLayout worked in my Case as follows:

    ProgressBar mSpinner = new ProgressBar(this); 
    mSpinner.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    mSpinner.setBackgroundResource(R.drawable.loading_1);
    mSpinner.setIndeterminate(true);
    

    enter image description here

    0 讨论(0)
提交回复
热议问题