Android 在对话框工作时更改 ProgressDialog 可绘制对象
Android change ProgressDialog drawable while dialog works
我有一个 ProgressDialog,它是在创建 Activity 时启动的(insideOnCreate 方法)。
private void initDialog() {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setTitle("Please wait.");
mProgressDialog.setMessage("Connecting to LinkedIn.");
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}
2500 毫秒后 我想将圆形动画更改为我的自定义图像(见下文)(就像关于我何时完成从服务器检索一些数据的模拟,我是完成。)所以我需要向用户展示该过程已完成。为了这个目标,我 select 下一个方法。
- 我显示对话框
- 当我检索数据时,我更改了 ProgressDialog 的可绘制对象
我有一个问题。当我第一次设置可绘制对象时
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 启动时(worked/circle 动画播放)我尝试重置一个 drawable
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 工作期间在运行时更改可绘制对象?
需要改为
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);
第一次与initDialog(false);
通话
据我检查,不确定的可绘制对象无法真正被替换,因此此解决方法可以避免您创建自定义 ProgressBar。
终于找到解决方法
ProgressDialog
包含一个 ProgressBar
来显示我们的 drawable。
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
的当前可绘制对象复制边界。您可以使用其他方式。
初始化对话框:
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.");
}
注:
解决方案未针对特定情况进行测试,例如
- 我们在
ActionBar
/TitleBar
中有一个进度条
- 另一种情况是我们已经在屏幕上显示
android.R.progress
window。在这种情况下,我认为我的解决方案会产生意想不到的行为。
我有一个 ProgressDialog,它是在创建 Activity 时启动的(insideOnCreate 方法)。
private void initDialog() {
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setTitle("Please wait.");
mProgressDialog.setMessage("Connecting to LinkedIn.");
mProgressDialog.setCancelable(false);
mProgressDialog.show();
}
2500 毫秒后 我想将圆形动画更改为我的自定义图像(见下文)(就像关于我何时完成从服务器检索一些数据的模拟,我是完成。)所以我需要向用户展示该过程已完成。为了这个目标,我 select 下一个方法。
- 我显示对话框
- 当我检索数据时,我更改了 ProgressDialog 的可绘制对象
我有一个问题。当我第一次设置可绘制对象时
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 启动时(worked/circle 动画播放)我尝试重置一个 drawable
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 工作期间在运行时更改可绘制对象?
需要改为
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);
第一次与initDialog(false);
据我检查,不确定的可绘制对象无法真正被替换,因此此解决方法可以避免您创建自定义 ProgressBar。
终于找到解决方法
ProgressDialog
包含一个 ProgressBar
来显示我们的 drawable。
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
的当前可绘制对象复制边界。您可以使用其他方式。
初始化对话框:
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.");
}
注:
解决方案未针对特定情况进行测试,例如
- 我们在
ActionBar
/TitleBar
中有一个进度条
- 另一种情况是我们已经在屏幕上显示
android.R.progress
window。在这种情况下,我认为我的解决方案会产生意想不到的行为。