Подтвердить что ты не робот

Android: ускоритель Progress Dialog не вращается

Это, кажется, проблема Android, которую вы можете увидеть в демонстрационных версиях API в разделе "Виды → панель прогресса → Диалоги".

В принципе, если вы показываете диалог прогресса, он работает как ожидается в первый раз. Если вы отпустите его и покажите снова (без разрушения активности или чего-то подобного), вращающееся изображение перестает вращаться. В Демо-версии API вы можете увидеть это, нажав "Показать неопределенный", нажимая назад, чтобы закрыть диалоговое окно, и снова нажмите кнопку.

Я попытался создать свой собственный диалог прогресса, однако он показывает ту же проблему, что и проблема с вращающимся изображением "ProgressBar".

Мне интересно, есть ли у кого-нибудь обходной путь для этой проблемы.

4b9b3361

Ответ 1

Если вы отклоните Dialog, вы не должны показывать тот же экземпляр снова. Либо создайте новый, либо используйте hide() вместо dismiss(). При использовании hide() вам все равно придется dismiss(), когда он больше не нужен.

Ответ 2

Я искал тот же ответ, однако ни один из ответов здесь не работал у меня, потому что я хотел использовать методы диалога Activity, такие как Activity.showDialog(), поэтому мне не пришлось управлять ими самостоятельно, а также чтобы они автоматически воссоздан по повороту.

Как и в некоторых других ответах, если функция увольнения() вызывается на ProgressDialog, она перестанет вращаться. Activity.onCreateDialog() сохраняет ссылку на диалог, поэтому после его создания он не будет воссоздан при следующем вызове Activity.showDialog(). Он просто вызовет Activity.onPrepareDialog() и использует экземпляр, который у него уже был. Если он был уволен, тогда он не будет вращаться, когда он будет показан снова.

Вы можете заставить его воссоздать себя, если вы вызываете Activity.removeDialog() с идентификатором ProgressDialog вместо вызова Dialog.dismiss(). Это отклонит его, а также удалит эту ссылку, поэтому, когда Activity.onShowDialog() будет вызван далее, он будет использовать Activity.onCreateDialog() вместо Activity.onPrepareDialog() и создать совершенно новый (и вращающийся) экземпляр.

Удостоверьтесь, что у вас есть ProgressDialog, который может быть отклонен или отменен, вы установили прослушиватель, чтобы вы могли вызвать Activity.removeDialog(). В противном случае он будет уволен. Вы также можете позвонить ему прямо перед тем, как позвонить Activity.showDialog().

Надеюсь, что это поможет кому-то.

Ответ 3

Вам не нужно использовать объекты onCreateDialog для ProgressDialog, как описано здесь http://developer.android.com/guide/topics/ui/dialogs.html#ProgressDialog. Вы должны создать и показать диалог выполнения в основном коде вместо использования showDialog и onCreateDialog.

Ответ 4

Вы можете объявить экземпляр 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

Вы можете определить класс и реализовать 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