如何在对话框上添加进度条

12
每当我想在我的应用程序中展示进度条时,我调用这个方法,该方法将进度条添加到我的布局中。
问题: 我想在对话框上显示此进度条,但是对话框总是显示在上面。这种情况该怎么办?
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);
    }

}

2
请评论,为什么要投反对票? - Harish Gyanani
1
为什么你需要添加over it?你可以展示一个并忽略另一个,反之亦然。 - Jitesh Mohite
我在整个项目中都在使用它,并且我还有一些自定义设计的对话框。这就是为什么它是必需的。 - Harish Gyanani
3
@jiteshmohite,我认为这是一个有效的要求。 - Sarthak Mittal
您可以将进度条作为对话框布局中的组件添加。 - Samir Bhatt
8个回答

8
尝试以下内容,应该可以在全局范围内正常工作:
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);
    }

}

1
在 layout.addView(rl, params); 中,rl 和 params 是什么? - Josef Vancura
rl = RelativeLayout - John

2

Try this

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

这将为您提供一个进度条,可以根据您的需求使用。

3
ProgressDialog自API 26起已被弃用。 - Aritz

2

Android有一个以AlertDialog为基类的ProgressDialog,并添加了进度功能:

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

并增加:

  progress.setProgress( ... );

检查这里获取更多信息。

8
请注意,这里使用了一个ProgressDialog,在API 26中已经被废弃。 - Dave Hubbard
这将不会显示在对话框上。 - Josef Vancura

1

1
我能想到的一件事是使用带有进度条的抽象Dialog Fragment或普通自定义Dialog。因此,您的类应该使您能够附加对话框或其他视图。以这种方式,每次您想要显示对话框时,都可以扩展该类或使用该类并提供视图。

或者

再次在对话框中调用进度对话框。但我更喜欢第一个方法。


1
如果您正在为对话框使用自定义设计布局,则可以将进度条放置在进度对话框的自定义布局中,并从那里使用它。然后,在显示对话框时,它将显示在对话框上方。

但是我需要一个全局解决方案,适用于项目中使用的所有对话框。如果我在它们的布局中添加进度条,那将会是太多的工作。 - Harish Gyanani
1
“全局解决方案”不好。可重用的解决方案很好。所谓“太多工作”是懒惰,而懒惰也是不好的。 - artkoenig
然后,您可以创建一个基本的对话框Activity或Fragment,以便您的自定义AlertDialog必须扩展它,以在所有不同类型的对话框屏幕中显示进度条。 - Parth Vora

0
simpleProgressBar.setMax(100); 
simpleProgressBar.setProgress(50); 

-1
请使用以下函数代码来控制 ProgressBar
public void Progressbar_Timer() {
    final ProgressDialog dialog = new ProgressDialog(AddEventImageLayout.this);
    dialog.setTitle("Placeing selected image...");
    dialog.setMessage("Please wait..");
    dialog.setIndeterminate(true);
    dialog.setCancelable(false);
    dialog.show();

    long delayInMillis = 10000;
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            dialog.dismiss();
        }
    }, delayInMillis);
    check = 2;
}

1
这不是进度条,而是进度对话框。 - Harish Gyanani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接