【问题标题】:Android: Progress Dialog spinner not spinningAndroid:进度对话框微调器不旋转
【发布时间】:2011-03-08 08:59:15
【问题描述】:
这似乎是 Android 范围内的问题,您可以在 API 演示中的 Views -> Progress Bar -> Dialogs 中看到。
基本上,如果您显示一个进度对话框,它会在第一次时按预期工作。如果您关闭它并再次显示它(不破坏活动或类似的东西),旋转的图像将停止旋转。在 API Demo 中,您可以通过单击“Show Indeterminate”、按回以关闭对话框并再次单击按钮来看到这一点。
我尝试构建自己的进度对话框,但它显示了同样的问题,因为问题在于“ProgressBar”旋转图像。
我想知道是否有人有解决此问题的方法。
【问题讨论】:
标签:
android
dialog
progress-bar
progress
【解决方案1】:
您可以定义类并实现 AsyncTask。您可以像这样在 doinbackground() 方法中定义您的后台进程。
@Override
protected String doInBackground(String... params) {
publishProgress(new Integer(1));
for(int i=0;i<=300;i++){
System.out.println(i);
}
publishProgress(new Integer(1));
for(int i=301;i<=600;i++){
System.out.println(i);
}
.................
....................
...........................
//your background tasks
publishProgress(new Integer(1));
for(int i=601;i<=900;i++){
System.out.println(i);
}
pd.dismiss();//dismiss the progress dialog here...
return null;
}
您还可以通过 onProgressUpdate() 方法显示您的进度信息。在http://www.androidcookers.co.cc/2011/12/want-to-run-progress-dialog-in-android.html查看完整的易于遵循的教程
【解决方案2】:
如果您关闭 Dialog,则不得再次显示相同的实例。要么创建一个新的,要么使用hide() 而不是dismiss()。使用 hide() 时,您仍然需要在不再需要时使用 dismiss()。
【解决方案3】:
我一直在寻找相同的答案,但是这里没有一个答案对我有用,因为我想使用 Activity 的对话框方法,例如 Activity.showDialog(),所以我不必自己管理它们,它们也会自动成为在轮换中重新创建。
就像其他一些答案所说,如果在 ProgressDialog 上调用 dismiss() ,它将停止旋转。 Activity.onCreateDialog() 保存对对话框的引用,因此一旦创建它就不会在下一次 Activity.showDialog() 调用中重新创建。它只会调用Activity.onPrepareDialog() 并使用它已经拥有的实例。如果它被关闭,那么当它再次显示时它不会旋转。
如果您使用ProgressDialog 的ID 调用Activity.removeDialog() 而不是调用Dialog.dismiss(),您可以强制它重新创建自己。这将关闭它并删除该引用,因此当接下来调用 Activity.onShowDialog() 时,它将使用 Activity.onCreateDialog() 而不仅仅是 Activity.onPrepareDialog() 并创建一个全新的(和旋转的)实例。
确保您是否有一个可以关闭或取消的ProgressDialog,您设置了一个侦听器,以便您可以调用Activity.removeDialog()。否则只会被驳回。您也可以在致电Activity.showDialog() 之前立即致电。
希望对某人有所帮助。
【解决方案4】:
您可以在 Activity 中声明 ProgressDialog 实例并覆盖 onCreateDialog(int)。然后,无需调用showDialog(int),您只需将ProgressDialog 的实例分配给onCreateDialog(int),您将调用dialog.show()。
public class Home extends Activity {
ProgressDialog recordingDialog;
//where you want to call the dialog
recordingDialog = (ProgressDialog)onCreateDialog(RECORDING_DIALOG_KEY);
@Override
protected Dialog onCreateDialog(int id) {
ProgressDialog dialog = new ProgressDialog(this);
switch (id) {
case RECORDING_DIALOG_KEY:
((ProgressDialog) dialog).setIndeterminate(true);
dialog.setCancelable(false);
((ProgressDialog) dialog)
.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("Recording...");
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Stop",
dialogStopListener);
dialog.show();
break;
default:
dialog = null;
}
return dialog;
}
}