Android:进度对话框旋转器未旋转

13

这似乎是一个全局的 Android 问题,你可以在 API demos 中的 Views -> Progress Bar -> Dialogs 下看到。

基本上,如果你显示一个进度对话框,第一次使用时它会按预期工作。如果你关闭它,然后再次显示它(而不销毁活动或其他任何操作),旋转的图像就不会继续旋转。在 API Demo 中,你可以通过点击“Show Indeterminate”,按返回键来关闭对话框,再次点击按钮来查看此情况。

我尝试构建自己的进度对话框,但它显示了相同的问题,因为问题出现在“ProgressBar”旋转图像上。

我想知道是否有人有解决此问题的方法。


可能是重复的问题? https://dev59.com/h3E95IYBdhLWcg3wn_Rr我们能看到一些代码吗?此外,您是否尝试在显示进度对话框之前每次重新创建它?所以像procDialog = new ProcessDialog(...)这样的东西。 - Mike
5个回答

25
如果您关闭了一个Dialog,则不能再次显示同一实例。请创建一个新的实例或使用hide()代替dismiss()。当使用hide()时,不再需要该对话框时仍然需要调用dismiss()

4

我也在寻找同样的答案,但是这里的所有答案都对我没有用,因为我想使用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()之前立即调用它。

希望这能帮助到某个人。


3

1
您可以在Activity中声明一个ProgressDialog实例并覆盖onCreateDialog(int)方法。然后,您只需将ProgressDialog实例分配给onCreateDialog(int)的调用,而不是调用showDialog(int)。在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;
}
}

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上查看完整易于跟随的教程。


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