Android change ProgressDialog可在对话框工作时绘制

Android change ProgressDialog可在对话框工作时绘制,android,progressdialog,Android,Progressdialog,我有一个ProgressDialog,在创建活动时启动它(insideOnCreate方法) 在2500ms后我想将一个圆圈动画更改为我的自定义图像(见下文)(就像模拟我何时完成从服务器检索一些数据并完成操作。)因此我需要向用户显示该过程已完成。为了这个目标,我选择了下一条路 我显示对话框 当我检索数据时,我更改ProgressDialog的drawable 这个我有个问题。当我第一次设置一个可拖动的 private void initDialog() { mProgressDialog

我有一个ProgressDialog,在创建活动时启动它(insideOnCreate方法)

在2500ms后我想将一个圆圈动画更改为我的自定义图像(见下文)(就像模拟我何时完成从服务器检索一些数据并完成操作。)因此我需要向用户显示该过程已完成。为了这个目标,我选择了下一条路

  • 我显示对话框
  • 当我检索数据时,我更改ProgressDialog的drawable
  • 这个我有个问题。当我第一次设置一个可拖动的

    private void initDialog() {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setTitle("Please wait.");
        mProgressDialog.setMessage("Connecting to LinkedIn.");
        mProgressDialog.setCancelable(false);
        //This
        mProgressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.ok));
        mProgressDialog.show();
    }
    
    ProgressDialog更改可绘制,所有看起来都正常。但是当ProgressBar启动(工作/循环动画播放)时,我尝试重置一个可绘制的

    mProgressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.ok));
    
    我有一个意想不到的结果:圆圈动画消失,并且没有图像设置为当前进度可绘制。没有图像!空白区域,而不是我的图像

        authButton.postDelayed(new Runnable() {
            @Override
            public void run() {
                mProgressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.ok)); //doesn't work as expected!
            }
        }, 2500);
    
    所以我的问题是-如何在ProgressDialog工作期间在运行时更改drawable? 需要改成 对于第一次使用
    initDialog调用(false)

    据我所知,无法真正替换不确定drawable,因此此解决方案可以避免您创建自定义ProgressBar。

    最后我找到了一个解决方案
    ProgressDialog
    包含一个
    ProgressBar
    ,它显示了我们的可绘制图形

    View view = inflater.inflate(a.getResourceId(com.android.internal.R.styleable.AlertDialog_horizontalProgressLayout, R.layout.alert_dialog_progress), null);
    mProgress = (ProgressBar) view.findViewById(R.id.progress); // THIS
    mProgressNumber = (TextView) view.findViewById(R.id.progress_number);
    mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);
    setView(view);
    
    当我们再次尝试将drawable设置为
    ProgressDialog
    时,ProgressDialog确实设置了一个新的drawable但此可绘制图形没有边界(显示此视图的坐标)<所以我们必须努力设置它。我选择了一种复制方式-仅复制当前可绘制的
    ProgressDialog
    的边界。你可以用另一种方法

    初始化对话框: 显示 易拉深 注: 未在特定情况下测试的解决方案,如

    • 我们在
      操作栏
      /
      标题栏
    • 另一种情况是,屏幕窗口上已经有了一个
      android.R.progress
      。在这种情况下,我认为我的解决方案是产生意想不到的行为

    有趣的问题:)是的。它可以工作,但会闪烁,因为我们显示了一个新的
    ProgressDialog
    是的,我遇到了相同的情况,有两个选项,要么使用这个,要么创建一个自定义ProgressBar.bar.GetIndeterminatedRavable方法在ProgressBar类中不存在,尽管在2020 android studio 3.7中。我只需要设定一个任意的界限。但是ProgressBar很好——谷歌不应该反对它。在iOS中必须使用库,但ProgressBar在Android中很好。
    private void initDialog(boolean is) {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setTitle("Please wait.");
        mProgressDialog.setMessage("Connecting to LinkedIn.");
        mProgressDialog.setCancelable(false);
        if(is) // take global variable
        mProgressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.ic_launcher));
        mProgressDialog.show();
        if(!is)
        new Handler().postDelayed(new Runnable() {
    
            @Override
            public void run() {
                mProgressDialog.cancel();
                mProgressDialog = null;
                initDialog(true);   
            }
        }, 2500);
    
    View view = inflater.inflate(a.getResourceId(com.android.internal.R.styleable.AlertDialog_horizontalProgressLayout, R.layout.alert_dialog_progress), null);
    mProgress = (ProgressBar) view.findViewById(R.id.progress); // THIS
    mProgressNumber = (TextView) view.findViewById(R.id.progress_number);
    mProgressPercent = (TextView) view.findViewById(R.id.progress_percent);
    setView(view);
    
    private void initDialog() {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setIndeterminate(true);
        mProgressDialog.setTitle("Please wait.");
        mProgressDialog.setMessage("Connecting to LinkedIn.");
        mProgressDialog.setCancelable(false);
    }
    
        mProgressDialog.show();
    
    private void changeToDone(int resId) {
        //Getting a progressBar from dialog
        ProgressBar bar = (ProgressBar) mProgressDialog.findViewById(android.R.id.progress);
        //Getting a DONE(new) drawable from resources
        Drawable drawable = getResources().getDrawable(resId);
        //Getting a drawable from progress dialog
        Drawable indeterminateDrawable = bar.getIndeterminateDrawable();
        //Obtain a bounds of current drawable
        Rect bounds = indeterminateDrawable.getBounds();
        //Set bounds to DONE(new) drawable
        drawable.setBounds(bounds);
        //Set a new drawable
        bar.setIndeterminateDrawable(drawable);
    
        mProgressDialog.setTitle("Done.");
        mProgressDialog.setMessage("Connected.");
    }