ProgressDialog erstellt von onCreateDialog stoppt belebende auf den zweiten Lauf
-
26-09-2019 - |
Frage
ich eine ProgressDialog
in onCreateDialog()
erstellen wie folgt:
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_PROGRESS_ID)
{
ProgressDialog dialog = new ProgressDialog(this);
dialog.setMessage(getResources().getString(R.string.MyLabel));
dialog.setCancelable(false);
dialog.setIndeterminate(true);
return dialog;
}
}
Android, in seiner Weisheit (oder gravierender Mangel davon) entscheidet über onCreateDialog () erstellt jeden Dialog zwischenzuspeichern. Dieser Grund, jeder nachfolgender Aufruf von showDialog(DIALOG_PROGRESS_ID)
Ergebnissen in der gleichen ProgressDialog Instanz verwendet wird, aber die Animation funktioniert nicht mehr.
Ich habe wieder Satz unbestimmt in onPrepareDialog()
versucht, aber das macht nichts. Ebenso gibt es keine offensichtliche Methode, um Anruf auf der Dialoginstanz, die die Animation zurückgesetzt wird.
protected void onPrepareDialog(int id, Dialog dialog)
{
//This doesn't do anything
if (id == DIALOG_PROGRESS_ID)
((ProgressDialog)dialog).setIndeterminate(true);
super.onPrepareDialog(id, dialog);
}
EDIT: Aber vielleicht gibt es eine Möglichkeit, die ProgressBar selbst zu bekommen und starten Sie es Animieren? so habe ich versucht, die folgende, nachdem ich diese Frage gestellt:
@Override
protected void onPrepareDialog(int id, Dialog dialog)
{
if (id == DIALOG_PROGRESS_ID)
{
ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress);
if (p.getAnimation() != null)
p.startAnimation(p.getAnimation());
}
super.onPrepareDialog(id, dialog);
}
Aber es hat nicht funktioniert entweder
Also, Wer weiß, ob es eine Möglichkeit zum Neustart Animation auf einem ProgressDialog ist? Wenn nicht, gibt es eine Möglichkeit, dass ich jede showdialog () -Aufruf onCreateDialog anrufen zwingen kann ()? (diese zweite Frage @TuomasR beantwortet wurde, aber nachdem es Grübeln ich glaube nicht, das ist eine sehr gute Lösung für mein Problem)
Lösung
Ha! Verstanden ... wurde auch mit diesen zu kämpfen. Aber Aufruf:
removeDialog(DIALOG_PROGRESS_ID)
unmittelbar nach dem
dismissDialog(...)
entfernt sie aus der (vermuteten) Dialog Cache für die Aktivität und Kräfte ein Aufruf an onCreateDialog
. Erstellen Sie ein neues ProgressDialog in onCreateDialog
und der Spinner belebt jedes Mal (für mich zumindest).
Andere Tipps
Ich weiß nicht, wie zu removeDialog es auf nächste Aufführung neu zu erstellen. Also, ich dieses Problem beheben, indem Sie onCreateDialog und onPrepareDialog:
1) In onCreateDialog schaffe ich normalerweise die ProgressDialog. 2) In onPrepareDialog I Referenz die progressBar hinein und Kraft neu zu starten:
@Override
protected void onPrepareDialog(int id, Dialog dialog, Bundle args) {
switch (id){
.....
case DIALOG_PROGRESS_ID:
ProgressBar p = (ProgressBar) dialog.findViewById(android.R.id.progress);
p.setVisibility(View.GONE);
p.setVisibility(View.VISIBLE);
break;
}
}
Nun, eine nicht so kühl Abhilfe würde die Parameter und nicht erklärt, die int privat wie in den Beispielen bearbeiten. Natürlich verlieren Sie die Möglichkeit, Schalter auf onCreateDialog, aber Sie scheinen nicht ohnehin tun, dass zu sein:
showDialog(++DIALOG_PROGRESS_ID);
Natürlich, wenn der Dialog mehrmals angezeigt wird, können Sie Speicherfehler haben. Nicht schön, aber sollte funktionieren.
Sie können auch versuchen.
if (progressDialog != null) {
progressDialog.dismiss();
progressDialog = null;
}