Najlepszy sposób na wyświetlenie wskaźnika ładowania / postępu?

146

Jaki jest najlepszy sposób na wyświetlenie wskaźnika ładowania, gdy aplikacja oczekuje na odpowiedź z serwera?

Czy można to zrobić programowo? Żebym nie musiał dodawać pokrętła ładowania w pliku xml?

Jochem Gruter
źródło

Odpowiedzi:

293

ProgressDialog został wycofany z systemu Android Oreo. Zamiast tego użyj 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();

LUB

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

Przeczytaj więcej tutaj.

Nawiasem mówiąc, Spinner ma inne znaczenie w Androidzie. (To jest jak menu wyboru w HTML)

Suraj Bajaj
źródło
1
Z witryny Android Developer: STYLE_SPINNER Tworzy okno dialogowe ProgressDialog z okrągłym, obracającym się paskiem postępu.
Tequilaman
34
To działa, ale kiedy to przetestowałem, mogłem zamknąć okno dialogowe, dotykając ekranu poza nim lub naciskając przycisk Wstecz . Naprawiłem to, dodając połączenie do progress.setCancelable(false);.
Sam
1
Dzięki za dolny komentarz. Szalałem, bo przez godzinę próbowałem zmusić „przędzarkę” do pracy.
Can Poyrazoğlu
super, teraz mogę użyć okna dialogowego postępu
Faisal
10
ProgressDialogzostał wycofany w systemie Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
17

ProgressDialog został wycofany od 26 poziomu API https://developer.android.com/reference/android/app/ProgressDialog.html

Dołączam ProgressBar do mojego układu

   <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" />

i zmień jego widoczność na .GONE | WIDOCZNE w zależności od przypadku użycia.

    progressBar_cyclic.visibility = View.VISIBLE
Ilker Baltaci
źródło
Nie jestem pewien, ale czy pasek postępu zawsze działa w tle (jest tylko ukryty w interfejsie użytkownika) po uczynieniu go niewidocznym?
Shambhu
16

Posługiwać się ProgressDialog

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

wprowadź opis obrazu tutaj

Jednak dzisiaj (2013) jest to uważane za anty-wzorzec: http://www.youtube.com/watch?v=pEGWcMTxs3I

vasart
źródło
12
@artworkad シ Więc jaki aspekt tego jest uważany za zły - czy przyjęta odpowiedź jest przykładem tego samego anty-wzorca? A co jest zalecane zamiast tego? Łączenie z zewnętrznym filmem o wielu problemach z UX nie poprawia tej odpowiedzi.
LarsH
2
ProgressDialogzostał wycofany w systemie Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
9

Właściwie, jeśli czekasz na odpowiedź z serwera, powinno to być zrobione programowo. Możesz utworzyć okno dialogowe postępu i zamknąć je, ale z drugiej strony nie jest to „sposób androida”.

Obecnie zalecaną metodą jest użycie DialogFragment :

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

Następnie w swojej aktywności ustawiasz menedżera fragmentów i wyświetlasz okno dialogowe po rozpoczęciu oczekiwania na serwer:

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

Gdy Twój serwer odpowie jako ukończony, odrzucisz go:

myInstance.dismiss()

Pamiętaj, że okno dialogowe postępu to pokrętło lub pasek postępu w zależności od atrybutów, więcej informacji znajdziesz w przewodniku po interfejsach API

quinestor
źródło
ProgressDialog.show (kontekst kontekstowy, tytuł CharSequence, komunikat CharSequence); Podanie parametru tytułu jako pustego ciągu powoduje usunięcie tytułu: ProgressDialog.show (kontekst, "", "Ładowanie ..");
Rajendra
1
Świetny przykład, chociaż nadal można było użyć przycisku Wstecz. Myślę, że to z powodu twojej zmiennej dlgAlert (i skąd to pochodzi z btw? :)). W każdym razie - ponieważ rozszerzasz dialogfragment, możesz po prostu wywołać setCancelable (false) i zadziała.
Lasse
Zatwierdzanie transakcji fragmentarycznych w nieokreślonym czasie, gdy serwer zwraca odpowiedź, nie wydaje się być niezawodne. Na przykład, gdy odpowiedź powróci, działanie, które obsługuje fragment, może być w złym stanie. Jakieś rozwiązanie?
Jonas
Upewnij się, że importujesz android.support.v4.app.DialogFragment, a nie android.app.DialogFragment, albo nie możesz użyć getSupportFragmentManager (patrz stackoverflow.com/questions/27514338/… )
StCleezy
ProgressDialogzostał wycofany w systemie Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
6

W ten sposób zrobiłem to, aby w danym momencie było otwarte tylko jedno okno dialogowe postępu. Na podstawie odpowiedzi Suraja Bajaja

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();
    }
}

Musiałem też użyć

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}
Isaac Zais
źródło
1
ProgressDialogzostał wycofany w systemie Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin