How to add progress bar over dialog

15,885

Solution 1

Try something like this, it should work globally :

public static void showProgressBar(@NonNull final Activity activity) {
    try {
        if (activity == null) {
            LogManager.printStackTrace(new NullActivityException());
            return;
        }

        final WindowManager wm = (WindowManager) activity.getApplicationContext().getSystemService(Activity.WINDOW_SERVICE);

        final ProgressBar progressBar = new ProgressBar(activity);
        progressBar.setIndeterminate(true);
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            Drawable wrapDrawable = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());
            DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(activity, R.color.colorAccent));
            progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
        }

        WindowManager.LayoutParams windowLayoutParams = new WindowManager.LayoutParams();
                windowLayoutParams.gravity = Gravity.CENTER;
                windowLayoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
                windowLayoutParams.token = activity.getWindow().getDecorView().getWindowToken();
                windowLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

        windowLayoutParams.height = LayoutParams.MATCH_PARENT;
        windowLayoutParams.width = LayoutParams.MATCH_PARENT;

        wm.addView(progressBar, windowLayoutParams);

        LogManager.i("ProgressBar", "ProgressUtils.showProgressBar->called");
        layout.addView(rl, params);

        mRunnable = new Runnable() {
            @Override
            public void run() {
                LogManager.i("ProgressBar", "ProgressUtils.showProgressBar->120 secs timeout");
                hideProgressBar(activity);
            }
        };
        mHandler = new Handler();
        mHandler.postDelayed(mRunnable, 120000);

        LogManager.i("ProgressBar", "Added");
    } catch (Exception e) {
        LogManager.printStackTrace(e);
    }

}

Solution 2

Android has a ProgressDialog with AlertDialog as base class, and adds a progress functionality:

  ProgressDialog progress = new ProgressDialog(this);
  progress.setMessage("Downloading Music");
  progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  progress.setIndeterminate(true);
  progress.setProgress(0);
  progress.show();

and increment:

  progress.setProgress( ... );

Check here for more.

Solution 3

Try to use dialog fragment for your dialog and inflate progress bar inside the layout of dialog fragment.For more info check this link.

https://developer.android.com/reference/android/app/DialogFragment.html

Solution 4

Try this

ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                        "Loading. Please wait...", true);

This will give you a progress bar which can be used as per your requirement.

Solution 5

If you are using custom design layout for your dialog then, you can put your progress bar inside your progress dialogs custom layout and use it from there. Then it will get displayed above ur dialog when ur dialog gets displayed.

Share:
15,885

Related videos on Youtube

Harish Gyanani
Author by

Harish Gyanani

I have been repeatedly recognized for my passion, presentation skills, teaching methods, Logical &amp; analytical skills, scalable solutions, automation tools &amp; plug-ins, UI design patterns and quality code.

Updated on October 27, 2022

Comments

  • Harish Gyanani
    Harish Gyanani over 1 year

    Whenever I want to show progress bar into my app, I call this method and this method adds ProgressBar into my layout.

    Problem : I want to show this progress bar over Dialog, but Dialog is always shown above. What can be done for this situation?

    public static void showProgressBar(@NonNull final Activity activity) {
        try {
            if (activity == null) {
                LogManager.printStackTrace(new NullActivityException());
                return;
            }
            View view = activity.findViewById(android.R.id.content);
            if (view == null) {
                LogManager.printStackTrace(new NullPointerException("content view is null"));
                return;
            }
            View rootView = activity.findViewById(android.R.id.content).getRootView();
            if (rootView == null || !(rootView instanceof ViewGroup)) {
                LogManager.printStackTrace(new NullPointerException("rootView is null or not an instance of ViewGroup"));
                return;
            }
            final ViewGroup layout = (ViewGroup) rootView;
    
            final ProgressBar progressBar = new ProgressBar(activity);
            progressBar.setIndeterminate(true);
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
                Drawable wrapDrawable = DrawableCompat.wrap(progressBar.getIndeterminateDrawable());
                DrawableCompat.setTint(wrapDrawable, ContextCompat.getColor(activity, R.color.colorAccent));
                progressBar.setIndeterminateDrawable(DrawableCompat.unwrap(wrapDrawable));
            }
            RelativeLayout.LayoutParams params = new
                    RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT);
            final RelativeLayout rl = new RelativeLayout(activity);
            rl.setBackgroundColor(ActivityCompat.getColor(activity, R.color.tc_hint_grey_alpha));
            rl.setClickable(true);
            rl.setTag("#$UniqueProgressBar");
            ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    120);
            rl.setGravity(Gravity.CENTER);
            rl.addView(progressBar, params2);
            LogManager.i("ProgressBar", "ProgressUtils.showProgressBar->called");
            layout.addView(rl, params);
    
            mRunnable = new Runnable() {
                @Override
                public void run() {
                    LogManager.i("ProgressBar", "ProgressUtils.showProgressBar->120 secs timeout");
                    hideProgressBar(activity);
                }
            };
            mHandler = new Handler();
            mHandler.postDelayed(mRunnable, 120000);
    
            LogManager.i("ProgressBar", "Added");
        } catch (Exception e) {
            LogManager.printStackTrace(e);
        }
    
    }
    
    • Harish Gyanani
      Harish Gyanani over 6 years
      Please comment, why vote down?
    • Jitesh Mohite
      Jitesh Mohite over 6 years
      why you need to add over it ? You can show one and dismiss other. vise versa
    • Sarthak Mittal
      Sarthak Mittal over 6 years
      @jiteshmohite i think it is a valid requirement.
  • Harish Gyanani
    Harish Gyanani over 6 years
    This is not progress bar, it is progress dialog.
  • Dave Hubbard
    Dave Hubbard over 6 years
    Note that this uses a ProgressDialog, which was just deprecated in API 26.
  • Aritz
    Aritz over 6 years
    ProgressDialog has now been deprecated since API 26