web-dev-qa-db-fra.com

Meilleur moyen de montrer un indicateur de chargement / progression?

Quel est le meilleur moyen d'afficher un spinner en cours de chargement lorsque l'application attend une réponse du serveur?

Cela peut-il être fait par programme? Pour que je n'ai pas à ajouter le chargement spinner dans le fichier XML?

138
Jochem Gruter

ProgressDialog est obsolète depuis Android Oreo. Utilisez ProgressBar à la place

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...");

Lire la suite ici.

Au fait, Spinner a une signification différente dans Android. (C'est comme le menu déroulant de sélection en HTML)

286
Suraj Bajaj

Utilisez ProgressDialog

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

enter image description here

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

16
vasart

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

J'inclus une barre de progression 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 changer sa visibilité en .GONE | .VISIBLE en fonction du cas d'utilisation.

    progressBar_cyclic.visibility = View.VISIBLE
12
Ilker Baltaci

En fait, si vous attendez la réponse d’un serveur, il faut être programmé. Vous pouvez créer une boîte de dialogue de progression et la rejeter, 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 complet, vous le rejetterez:

myInstance.dismiss()

Rappelez-vous que le progressdialog est un spinner ou une barre de progression en fonction des attributs, en savoir plus sur le guide api

9
quinestor

Voici comment je l'ai fait pour qu'un seul dialogue de progression puisse être ouvert à 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();
    }
}

J'ai aussi dû utiliser

protected void onResume() {
    dismissLoadingDialog();
    super.onResume();
}
5
Isaac Zais