Meilleur moyen d'afficher un indicateur de chargement / progression?

147

Quelle est la meilleure façon d'afficher un spinner de chargement pendant que l'application attend une réponse du serveur?

Cela peut-il être fait par programme? Pour ne pas avoir à ajouter le spinner de chargement dans le fichier xml?

Jochem Gruter
la source

Réponses:

293

ProgressDialog est obsolète depuis Android Oreo. Utilisez plutôt 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();

OU

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

En savoir plus ici.

À propos, Spinner a une signification différente dans Android. (C'est comme la liste déroulante de sélection en HTML)

Suraj Bajaj
la source
1
Depuis le site Web des développeurs Android: STYLE_SPINNER Crée un ProgressDialog avec une barre de progression circulaire et rotative.
Tequilaman
34
Cela fonctionne, mais lorsque j'ai testé cela, je pouvais fermer la boîte de dialogue en touchant l'écran à l'extérieur ou en appuyant sur le bouton Retour . J'ai résolu ce problème en ajoutant un appel à progress.setCancelable(false);.
Sam le
1
Merci pour le commentaire du bas. Je devenais fou parce que j'essayais de faire travailler le «spinner» pendant une heure.
Can Poyrazoğlu
superbe, maintenant je peux utiliser la boîte de dialogue de progression
Faisal
10
ProgressDialogest obsolète dans Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
17

ProgressDialog est devenu obsolète depuis le niveau d'API 26 https://developer.android.com/reference/android/app/ProgressDialog.html

J'inclus une ProgressBar dans ma mise en page

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

et changez sa visibilité en .GONE | .VISIBLE selon le cas d'utilisation.

    progressBar_cyclic.visibility = View.VISIBLE
Ilker Baltaci
la source
Pas sûr, mais progressBar s'exécute-t-il toujours en arrière-plan (juste caché de l'interface utilisateur) après l'avoir rendu invisible?
Shambhu
16

Utilisation ProgressDialog

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

entrez la description de l'image ici

Cependant, cela est considéré comme un anti-pattern aujourd'hui (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I

Vasart
la source
12
@artworkad シ Alors, quel aspect de ceci est considéré comme mauvais - la réponse acceptée est-elle un exemple du même anti-modèle? Et qu'est-ce qu'il est recommandé de faire à la place? Le lien vers une vidéo hors site sur plusieurs problèmes UX n'améliore pas vraiment cette réponse.
LarsH
2
ProgressDialogest obsolète dans Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
9

En fait, si vous attendez une réponse d'un serveur, cela doit être fait par programme. Vous pouvez créer une boîte de dialogue de progression et la fermer, mais là encore, ce n'est pas "la manière Android".

Actuellement, la méthode recommandée consiste à utiliser 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;
    }
}

Ensuite, dans votre activité, vous définissez votre gestionnaire de fragments et affichez la boîte de dialogue une fois que l'attente du serveur a commencé:

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

Une fois que votre serveur a répondu, vous le rejetterez:

myInstance.dismiss()

Rappelez-vous que le progressdialog est un spinner ou une barre de progression selon les attributs, en savoir plus sur le guide de l' API

quinestor
la source
ProgressDialog.show (contexte de contexte, titre CharSequence, message CharSequence); Passer le paramètre title sous forme de chaîne vide supprime le titre: ProgressDialog.show (context, "", "Loading ..");
Rajendra
1
Bel exemple, même s'il était encore possible pour moi d'utiliser le bouton retour. Je pense que c'est à cause de votre variable dlgAlert (et d'où vient-elle de btw? :)). Quoi qu'il en soit - puisque vous étendez dialogfragment, vous pouvez simplement appeler setCancelable (false) et cela fonctionnera.
Lasse
La validation de transactions de fragment à un moment indéterministe lorsque le serveur renvoie une réponse ne semble pas infaillible. Par exemple, lorsque la réponse revient, l'activité qui héberge le fragment peut être dans un état incorrect. Toute solution?
Jonas
Assurez-vous que vous importez android.support.v4.app.DialogFragment et non android.app.DialogFragment, ou vous ne pouvez pas utiliser getSupportFragmentManager (voir stackoverflow.com/questions/27514338/… )
StCleezy
ProgressDialogest obsolète dans Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin
6

C'est ainsi que j'ai fait cela afin qu'une seule boîte de dialogue de progression puisse être ouverte à la fois. Basé sur la réponse de 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();
    }
}

Je devais aussi utiliser

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}
Isaac Zais
la source
1
ProgressDialogest obsolète dans Android O developer.android.com/reference/android/app/ProgressDialog.html
Ivan Semkin