Der beste Weg, um eine Lade- / Fortschrittsanzeige anzuzeigen?


146

Was ist der beste Weg, um einen Ladespinner anzuzeigen, während die App auf eine Antwort vom Server wartet?

Kann dies programmgesteuert erfolgen? Damit ich den Load Spinner nicht in die XML-Datei einfügen muss?

Antworten:


293

ProgressDialog ist von Android Oreo veraltet. Verwenden Sie stattdessen ProgressBar

ProgressDialog progress = new ProgressDialog(this);
progress.setTitle("Loading");
progress.setMessage("Wait while loading...");
progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
progress.show();
// To dismiss the dialog
progress.dismiss();

ODER

ProgressDialog.show(this, "Loading", "Wait while loading...");

Lesen Sie hier mehr.

Übrigens hat Spinner in Android eine andere Bedeutung. (Es ist wie die Auswahl Dropdown in HTML)


1
Von der Android Developer-Website: STYLE_SPINNER Erstellt einen ProgressDialog mit einem kreisförmigen, sich drehenden Fortschrittsbalken.
Tequilaman

34
Dies funktioniert, aber als ich dies getestet habe, konnte ich den Dialog schließen, indem ich den Bildschirm außerhalb davon berührte oder die Zurück- Taste drückte . Ich habe dies behoben, indem ich einen Anruf hinzugefügt habe progress.setCancelable(false);.
Sam

1
Danke für den unteren Kommentar. Ich wurde verrückt, weil ich versuchte, 'Spinner' für eine Stunde zum Arbeiten zu bringen.
Kann Poyrazoğlu

Hervorragend, jetzt kann ich den Fortschrittsdialog verwenden
Faisal


17

ProgressDialog ist seit API Level 26 https://developer.android.com/reference/android/app/ProgressDialog.html veraltet

Ich füge eine ProgressBar in mein Layout ein

   <ProgressBar
        android:layout_weight="1"
        android:id="@+id/progressBar_cyclic"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="40dp"
        android:minWidth="40dp" />

und ändern Sie die Sichtbarkeit in .GONE | .SICHTBAR je nach Anwendungsfall.

    progressBar_cyclic.visibility = View.VISIBLE

Sie sind sich nicht sicher, aber wird die progressBar immer im Hintergrund ausgeführt (nur vor der Benutzeroberfläche verborgen), nachdem sie unsichtbar gemacht wurde?
Shambhu

16

Verwenden ProgressDialog

ProgressDialog.show(Context context, CharSequence title, CharSequence message);

Geben Sie hier die Bildbeschreibung ein

Dies wird jedoch heute (2013) als Anti-Muster angesehen: http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Welcher Aspekt davon wird als schlecht angesehen - ist die akzeptierte Antwort ein Beispiel für dasselbe Anti-Muster? Und was wird stattdessen empfohlen? Das Verknüpfen mit einem Offsite-Video zu mehreren UX-Problemen verbessert diese Antwort nicht wirklich.
LarsH


9

Wenn Sie auf eine Antwort von einem Server warten, sollte dies tatsächlich programmgesteuert erfolgen. Sie können einen Fortschrittsdialog erstellen und ihn schließen, aber das ist auch nicht "der Android-Weg".

Derzeit wird empfohlen, ein DialogFragment zu verwenden :

public class MySpinnerDialog extends DialogFragment {

    public MySpinnerDialog() {
        // use empty constructors. If something is needed use onCreate's
    }

    @Override
    public Dialog onCreateDialog(final Bundle savedInstanceState) {

        _dialog = new ProgressDialog(getActivity());
        this.setStyle(STYLE_NO_TITLE, getTheme()); // You can use styles or inflate a view
        _dialog.setMessage("Spinning.."); // set your messages if not inflated from XML

        _dialog.setCancelable(false);  

        return _dialog;
    }
}

Dann legen Sie in Ihrer Aktivität Ihren Fragment-Manager fest und zeigen den Dialog an, sobald das Warten auf den Server begonnen hat:

FragmentManager fm = getSupportFragmentManager();
MySpinnerDialog myInstance = new MySpinnerDialog();
}
myInstance.show(fm, "some_tag");

Sobald Ihr Server vollständig geantwortet hat, werden Sie ihn schließen:

myInstance.dismiss()

Denken Sie daran, dass der Fortschrittsdialog je nach Attribut ein Spinner oder ein Fortschrittsbalken ist. Weitere Informationen finden Sie in der API-Anleitung


ProgressDialog.show (Kontextkontext, CharSequence-Titel, CharSequence-Nachricht); Wenn Sie den Titelparameter als leere Zeichenfolge übergeben, wird der Titel entfernt: ProgressDialog.show (context, "", "Loading ..");
Rajendra

1
Gutes Beispiel, obwohl es mir immer noch möglich war, den Zurück-Button zu benutzen. Ich denke, das liegt an Ihrer Variablen dlgAlert (und woher kommt das übrigens? :)). Wie auch immer - da Sie dialogfragment erweitern, können Sie einfach setCancelable (false) aufrufen und es wird funktionieren.
Lasse

Das Festschreiben von Fragmenttransaktionen zu einem unbestimmten Zeitpunkt, zu dem der Server eine Antwort zurückgibt, scheint nicht narrensicher zu sein. Wenn beispielsweise die Antwort zurückkommt, befindet sich die Aktivität, die das Fragment hostet, möglicherweise im falschen Zustand. Irgendeine Lösung?
Jonas

Stellen Sie sicher, dass Sie android.support.v4.app.DialogFragment und nicht android.app.DialogFragment importieren, oder Sie können getSupportFragmentManager nicht verwenden (siehe stackoverflow.com/questions/27514338/… )
StCleezy


6

So habe ich das gemacht, damit immer nur ein Fortschrittsdialog geöffnet sein kann. Basierend auf der Antwort von Suraj Bajaj

private ProgressDialog progress;



public void showLoadingDialog() {

    if (progress == null) {
        progress = new ProgressDialog(this);
        progress.setTitle(getString(R.string.loading_title));
        progress.setMessage(getString(R.string.loading_message));
    }
    progress.show();
}

public void dismissLoadingDialog() {

    if (progress != null && progress.isShowing()) {
        progress.dismiss();
    }
}

Ich musste auch verwenden

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.