Il modo migliore per mostrare un indicatore di caricamento / avanzamento?


147

Qual è il modo migliore per mostrare uno spinner di caricamento mentre l'app è in attesa di una risposta dal server?

Questo può essere fatto a livello di codice? In modo che non devo aggiungere lo spinner di caricamento nel file XML?

Risposte:


293

ProgressDialog è obsoleto da Android Oreo. Utilizzare invece 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();

O

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

Leggi di più qui.

A proposito, Spinner ha un significato diverso in Android. (È come il menu a discesa Seleziona in HTML)


1
Dal sito Web per sviluppatori Android: STYLE_SPINNER Crea un ProgressDialog con una barra di avanzamento circolare e rotante.
Tequilaman,

34
Funziona, ma quando ho provato questo, ho potuto chiudere la finestra di dialogo toccando lo schermo al di fuori di esso o premendo il pulsante Indietro . Ho risolto il problema aggiungendo una chiamata a progress.setCancelable(false);.
Sam,

1
Grazie per il commento in basso. Stavo impazzendo perché stavo cercando di far funzionare "spinner" per un'ora.
Can Poyrazoğlu,

superbo, ora posso usare la finestra di dialogo sull'avanzamento
Faisal,

10
ProgressDialogè stato deprecato in Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

17

ProgressDialog è diventato obsoleto dal livello API 26 https://developer.android.com/reference/android/app/ProgressDialog.html

Includo un ProgressBar nel mio layout

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

e cambia la sua visibilità in .GONE | .VISIBILE a seconda del caso d'uso.

    progressBar_cyclic.visibility = View.VISIBLE

Non sono sicuro, ma progressBar funziona sempre in background (appena nascosto dall'interfaccia utente) dopo averlo reso invisibile?
Shambhu

16

Uso ProgressDialog

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

inserisci qui la descrizione dell'immagine

Tuttavia, questo è considerato come un modello anti oggi (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I


12
@artworkad シ Quindi quale aspetto di questo è considerato negativo - la risposta accettata è un esempio dello stesso anti-schema? E cosa si consiglia di fare invece? Il collegamento a un video esterno su più problemi di UX non migliora davvero questa risposta.
LarsH,

2
ProgressDialogè stato deprecato in Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

9

In realtà, se stai aspettando una risposta da un server, dovrebbe essere fatto programmaticamente. È possibile creare una finestra di dialogo di avanzamento e chiuderla, ma non è "la via Android".

Attualmente il metodo raccomandato è usare un 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;
    }
}

Quindi, nella tua attività, imposti il ​​gestore dei frammenti e mostri la finestra di dialogo una volta avviata l'attesa del server:

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

Una volta che il tuo server avrà risposto completo, lo eliminerai:

myInstance.dismiss()

Ricorda che progressdialog è uno spinner o una barra di avanzamento a seconda degli attributi, leggi di più sulla guida api


ProgressDialog.show (contesto di contesto, titolo CharSequence, messaggio CharSequence); Passando il parametro title come stringa vuota si rimuove il titolo: ProgressDialog.show (context, "", "Loading ..");
Rajendra,

1
Ottimo esempio, anche se era ancora possibile utilizzare il pulsante Indietro. Penso che sia a causa della tua variabile dlgAlert (e da dove viene quella btw? :)). Ad ogni modo, poiché stai estendendo dialogfragment, puoi semplicemente chiamare setCancelable (false) e funzionerà.
Lasse,

Effettuare transazioni di frammenti in un momento indeterminato quando il server restituisce una risposta non sembra essere infallibile. Ad esempio, quando la risposta ritorna, l'attività che ospita il frammento potrebbe essere nello stato sbagliato. Qualche soluzione?
Jonas,

Assicurarsi che si sta importando android.support.v4.app.DialogFragment e non android.app.DialogFragment, o non è possibile utilizzare getSupportFragmentManager (vedi stackoverflow.com/questions/27514338/... )
StCleezy

ProgressDialogè stato deprecato in Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin

6

È stato così che ho potuto aprire una sola finestra di dialogo alla volta. Basato sulla risposta di 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();
    }
}

Ho anche dovuto usare

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

1
ProgressDialogè stato deprecato in Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.