Ответ 1
Если вы отклоните Dialog
, вы не должны показывать тот же экземпляр снова. Либо создайте новый, либо используйте hide()
вместо dismiss()
. При использовании hide()
вам все равно придется dismiss()
, когда он больше не нужен.
Это, кажется, проблема Android, которую вы можете увидеть в демонстрационных версиях API в разделе "Виды → панель прогресса → Диалоги".
В принципе, если вы показываете диалог прогресса, он работает как ожидается в первый раз. Если вы отпустите его и покажите снова (без разрушения активности или чего-то подобного), вращающееся изображение перестает вращаться. В Демо-версии API вы можете увидеть это, нажав "Показать неопределенный", нажимая назад, чтобы закрыть диалоговое окно, и снова нажмите кнопку.
Я попытался создать свой собственный диалог прогресса, однако он показывает ту же проблему, что и проблема с вращающимся изображением "ProgressBar".
Мне интересно, есть ли у кого-нибудь обходной путь для этой проблемы.
Если вы отклоните Dialog
, вы не должны показывать тот же экземпляр снова. Либо создайте новый, либо используйте hide()
вместо dismiss()
. При использовании hide()
вам все равно придется dismiss()
, когда он больше не нужен.
Я искал тот же ответ, однако ни один из ответов здесь не работал у меня, потому что я хотел использовать методы диалога 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()
.
Надеюсь, что это поможет кому-то.
Вам не нужно использовать объекты onCreateDialog
для ProgressDialog
, как описано здесь http://developer.android.com/guide/topics/ui/dialogs.html#ProgressDialog. Вы должны создать и показать диалог выполнения в основном коде вместо использования showDialog
и onCreateDialog
.
Вы можете объявить экземпляр 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;
}
}
Вы можете определить класс и реализовать 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