【问题标题】:Android: Progress Dialog spinner not spinningAndroid:进度对话框微调器不旋转
【发布时间】:2011-03-08 08:59:15
【问题描述】:

这似乎是 Android 范围内的问题,您可以在 API 演示中的 Views -> Progress Bar -> Dialogs 中看到。

基本上,如果您显示一个进度对话框,它会在第一次时按预期工作。如果您关闭它并再次显示它(不破坏活动或类似的东西),旋转的图像将停止旋转。在 API Demo 中,您可以通过单击“Show Indeterminate”、按回以关闭对话框并再次单击按钮来看到这一点。

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

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

【问题讨论】:

  • 可能重复? stackoverflow.com/questions/2231438/… 可以看一下代码吗?您是否也尝试过在每次显示之前重新创建 processdialog?所以像 procDialog = new ProcessDialog(...);

标签: 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;
        }
        }
        

        【讨论】:

          【解决方案5】:

          您不必将onCreateDialog 用于ProgressDialog 对象,如http://developer.android.com/guide/topics/ui/dialogs.html#ProgressDialog 此处所述。您应该在主代码中创建并显示进度对话框,而不是使用showDialogonCreateDialog

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多