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