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?
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...");
Au fait, Spinner a une signification différente dans Android. (C'est comme le menu déroulant de sélection en HTML)
Utilisez ProgressDialog
ProgressDialog.show(Context context, CharSequence title, CharSequence message);
Cependant, ceci est considéré comme un anti-modèle aujourd'hui (2013): http://www.youtube.com/watch?v=pEGWcMTxs3I
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
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
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();
}