Android: счетчик диалога прогресса не вращается

Похоже, это проблема всего Android, которую вы можете увидеть в демонстрациях API в разделе Views -> Progress Bar -> Dialogs.

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

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

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


person Martin    schedule 25.06.2010    source источник
comment
возможный дубликат? stackoverflow.com/questions/2231438/ Можем ли мы увидеть код? Вы также пробовали воссоздавать диалоговое окно процесса каждый раз перед его отображением? так что-то вроде procDialog = new ProcessDialog (...);   -  person Mike    schedule 25.06.2010


Ответы (5)


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

person ognian    schedule 25.06.2010

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

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

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

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

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

person cottonBallPaws    schedule 25.01.2011

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

person cristis    schedule 25.06.2010

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

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

person Yashraj    schedule 16.12.2011