2010-06-25 9 views
13

Wygląda na to, że problem dotyczy całego systemu Android, który można zobaczyć w prezentacjach API pod Widokami -> Pasek postępu -> Dialogi.Android: Spinner Dialogu Postępu nie kręci się

Zasadniczo, jeśli pokażesz okno dialogowe postępu, po raz pierwszy działa ono zgodnie z oczekiwaniami. Jeśli ją odrzucisz i pokażesz ponownie (bez niszczenia czynności lub czegoś podobnego), obracający się obraz przestanie się obracać. W Demo interfejsu API możesz to zobaczyć, klikając "Pokaż nieokreślone", naciskając ponownie, aby zamknąć okno dialogowe i ponownie klikając przycisk.

Próbowałem już zbudować własne okno dialogowe postępu, jednak pokazuje ten sam problem, ponieważ problem dotyczy obracającego się obrazu "ProgressBar".

Zastanawiam się, czy ktoś ma obejście tego problemu.

+0

możliwe duplikat? http://stackoverflow.com/questions/2231438/progress-dialog-while-starting-new-activity Czy możemy zobaczyć kod? Czy próbowałeś również odtworzyć processdialog za każdym razem, zanim się wyświetli? więc coś takiego jak procDialog = new ProcessDialog (...); – Mike

Odpowiedz

24

Jeśli odrzucisz Dialog, nie możesz ponownie wyświetlać tej samej instancji. Utwórz nowy lub użyj hide() zamiast dismiss(). Gdy używasz hide(), musisz go nadal mieć dismiss(), gdy nie jest już potrzebny.

1

Możesz zadeklarować instancję ProgressDialog w swojej Działalności i zastąpić onCreateDialog(int). Następnie zamiast zadzwonić pod numer showDialog(int), wystarczy przypisać instancję o numerze ProgressDialog, dzwoniąc pod numer onCreateDialog(int), gdzie można zadzwonić pod numer 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

szukałem tej samej odpowiedzi, jednak żadna z odpowiedzi tutaj pracował dla mnie, bo chciałem użyć metod dialogowych aktywności niczym Activity.showDialog() więc nie trzeba zarządzać ich sobie, a także dlatego, że byłoby automatycznie odtwarzać na rotacji.

Podobnie jak w niektórych innych odpowiedziach, jeśli wywołanie funkcji throw() zostanie wywołane na ProgressDialog, to przestanie się obracać. Activity.onCreateDialog() zapisuje odniesienie do okna dialogowego, więc po jego utworzeniu nie zostanie odtworzone podczas następnego połączenia Activity.showDialog(). Po prostu zadzwoni pod numer Activity.onPrepareDialog() i użyje instancji, którą już posiadał. Jeśli zostanie odrzucony, nie będzie się obracał, gdy zostanie ponownie wyświetlony.

Można go zmusić do odtworzenia się, jeśli wywołasz Activity.removeDialog() z identyfikatorem ProgressDialog zamiast wywoływać Dialog.dismiss(). Spowoduje to odrzucenie go i usunięcie tego odwołania, aby po następnym wywołaniu nazwy Activity.onShowDialog() użyje ona Activity.onCreateDialog() zamiast tylko Activity.onPrepareDialog() i stworzy zupełnie nową (i wirującą) instancję.

Upewnij się, że masz ProgressDialog, który można odrzucić lub anulować, a następnie ustawić odbiornik, aby móc zadzwonić pod numer Activity.removeDialog(). W przeciwnym razie zostanie odwołany. Możesz również zadzwonić do niej tuż przed zadzwonieniem pod numer Activity.showDialog().

Nadzieję, że pomaga komuś.

1

Możesz zdefiniować klasę i zaimplementować AsyncTask. Tam definiujesz swoje procesy w tle w metodzie doinbackground() w ten sposób.

@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; 
} 

Można również wyświetlić informacje o postępie przez onProgressUpdate() method.Check pełne łatwy do naśladowania samouczka na http://www.androidcookers.co.cc/2011/12/want-to-run-progress-dialog-in-android.html

Powiązane problemy