2010-06-25 6 views
13

Это, кажется, проблема Android, которую вы можете увидеть в демонстрационных версиях API в разделе «Виды -> Панель прогресса -> Диалоги».Android: Progress Dialog spinner не вращается

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

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

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

+0

можно дублировать? http://stackoverflow.com/questions/2231438/progress-dialog-while-starting-new-activity Можно ли увидеть какой-нибудь код? Также вы пробовали воссоздать processdialog каждый раз, прежде чем он показывает? поэтому что-то вроде procDialog = new ProcessDialog (...); – Mike

ответ

24

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

1

В вашей деятельности вы можете объявить пример 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; 
} 
} 
4

Я искал тот же ответ, однако ни один из ответов здесь не работал для меня, потому что я хотел использовать диалоговые методы своей деятельности как 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().

Надежды, которые помогают кому-то.

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() method.Check полный легко следовать учебник по http://www.androidcookers.co.cc/2011/12/want-to-run-progress-dialog-in-android.html

Смежные вопросы