J'ai rencontré pour voir que ProgressDialog
est maintenant obsolète. Quelle alternative serait d'utiliser à la place de cela en dehors de ProgressBar
. J'utilise Android studio version 2.3.3.
ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
Oui, dans API level 26
il est déconseillé. Au lieu de cela, vous pouvez utiliser progressBar
.
Pour le créer par programme:
D'abord obtenir une référence à la mise en page racine
RelativeLayout layout = findViewById(R.id.display); //specify here Root layout Id
ou
RelativeLayout layout = findViewById(this);
Ajoutez ensuite la barre de progression
progressBar = new ProgressBar(youractivity.this, null, Android.R.attr.progressBarStyleLarge);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(100, 100);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
layout.addView(progressBar, params);
Pour afficher la barre de progression
progressBar.setVisibility(View.VISIBLE);
Pour masquer la barre de progression
progressBar.setVisibility(View.GONE);
Pour désactiver l'interaction utilisateur, il vous suffit d'ajouter le code suivant
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Pour récupérer l'interaction de l'utilisateur, il vous suffit d'ajouter le code suivant.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Juste pour référence future, changez le Android.R.attr.progressBarStyleSmall
en Android.R.attr.progressBarStyleHorizontal
.
Le code ci-dessous ne fonctionne que ci-dessus API level 21
progressBar.setProgressTintList(ColorStateList.valueOf(Color.RED));
Pour le créer via xml:
<ProgressBar
Android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:indeterminate="true"
Android:max="100"
Android:backgroundTint="@color/white"
Android:layout_below="@+id/framelauout"
Android:indeterminateTint="#1a09d6"
Android:layout_marginTop="-7dp"/>
Dans votre activité
progressBar = (ProgressBar) findViewById(R.id.progressbar);
Afficher/masquer la barre de progression est identique
progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar
progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar
Voici un exemple d’image:
Pour plus de détails:
1. Référence une
2. Référence 2
Cette classe était obsolète dans l'API de niveau 26. ProgressDialog est une boîte de dialogue modale qui empêche l'utilisateur d'interagir avec l'application. Au lieu d'utiliser cette classe, vous devez utiliser un indicateur de progression, tel que ProgressBar, qui peut être intégré à l'interface utilisateur de votre application. Vous pouvez également utiliser une notification pour informer l'utilisateur de la progression de la tâche. lien
Il est obsolète à Android O
en raison de Google
nouvelle norme d'interface utilisateur
vous pouvez utiliser AlertDialog
comme ProgressDialog
référez-vous au code ci-dessous pour le ProgressDialog
. Cette fonction vous devez appeler chaque fois que vous affichez une boîte de dialogue de progression.
Code:
public void setProgressDialog() {
int llPadding = 30;
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.HORIZONTAL);
ll.setPadding(llPadding, llPadding, llPadding, llPadding);
ll.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams llParam = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
llParam.gravity = Gravity.CENTER;
ll.setLayoutParams(llParam);
ProgressBar progressBar = new ProgressBar(this);
progressBar.setIndeterminate(true);
progressBar.setPadding(0, 0, llPadding, 0);
progressBar.setLayoutParams(llParam);
llParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
llParam.gravity = Gravity.CENTER;
TextView tvText = new TextView(this);
tvText.setText("Loading ...");
tvText.setTextColor(Color.parseColor("#000000"));
tvText.setTextSize(20);
tvText.setLayoutParams(llParam);
ll.addView(progressBar);
ll.addView(tvText);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(true);
builder.setView(ll);
AlertDialog dialog = builder.create();
dialog.show();
Window window = dialog.getWindow();
if (window != null) {
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.copyFrom(dialog.getWindow().getAttributes());
layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
dialog.getWindow().setAttributes(layoutParams);
}
}
Sortie:
Vous pouvez simplement concevoir une interface xml pour votre barre de progression et la transmettre sous forme de vue à un AlertDialog, puis afficher ou fermer la boîte de dialogue à tout moment.
progress.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="horizontal"
Android:padding="13dp"
Android:layout_centerHorizontal="true"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content">
<ProgressBar
Android:id="@+id/loader"
Android:layout_marginEnd="5dp"
Android:layout_width="45dp"
Android:layout_height="45dp" />
<TextView
Android:layout_width="wrap_content"
Android:text="Loading..."
Android:textAppearance="?android:textAppearanceSmall"
Android:layout_gravity="center_vertical"
Android:id="@+id/loading_msg"
Android:layout_toEndOf="@+id/loader"
Android:layout_height="wrap_content" />
</LinearLayout>
Le code code qui affiche la boîte de dialogue de progression. Copiez simplement ce code et collez-le dans votre fragment.
private void setDialog(boolean show){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
//View view = getLayoutInflater().inflate(R.layout.progress);
builder.setView(R.layout.progress);
Dialog dialog = builder.create();
if (show)dialog.show();
else dialog.dismiss();
}
Ensuite, appelez simplement la méthode chaque fois que vous souhaitez afficher le progrèsdialog et transmettez true comme argument pour le montrer ou faux pour fermer la boîte de dialogue.
ProgressBar est très simple et facile à utiliser, j’ai l’intention de faire la même chose qu’un simple dialogue de progression. La première étape est que vous pouvez faire une mise en page XML de la boîte de dialogue que vous souhaitez afficher, disons que nous appelons cette mise en page.
layout_loading_dialog.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:padding="20dp">
<ProgressBar
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight="1" />
<TextView
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:layout_weight="4"
Android:gravity="center"
Android:text="Please wait! This may take a moment." />
</LinearLayout>
la prochaine étape est de créer AlertDialog qui montrera cette mise en page avec ProgressBar
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setCancelable(false); // if you want user to wait for some process to finish,
builder.setView(R.layout.layout_loading_dialog);
AlertDialog dialog = builder.create();
maintenant tout ce qui reste à faire est d'afficher et de masquer cette boîte de dialogue dans nos événements de clic comme celui-ci
dialog.show(); // to show this dialog
dialog.dismiss(); // to hide this dialog
et ça y est, cela devrait fonctionner, comme vous pouvez le constater, il est extrêmement simple et facile de mettre en oeuvre ProgressBar au lieu de ProgressDialog. maintenant vous pouvez afficher/fermer cette boîte de dialogue dans Handler ou ASyncTask, cela vous convient
Eh bien, si vous voulez vraiment aller contre leur volonté, vous pouvez toujours utiliser Sweet Alert Dialog ou en créer un vous-même.
progress_dialog_layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TableRow
Android:layout_centerInParent="true"
Android:layout_width="match_parent"
Android:layout_height="64dp" >
<ProgressBar
Android:id="@+id/progressBar2"
style="?android:attr/progressBarStyle"
Android:layout_width="wrap_content"
Android:layout_height="match_parent" />
<TextView
Android:gravity="center|left"
Android:id="@+id/textView9"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:textColor="@color/black"
Android:textSize="18sp"
Android:text="Downloading data. Please wait.." />
</TableRow>
</RelativeLayout>
code Java:
AlertDialog b;
AlertDialog.Builder dialogBuilder;
public void ShowProgressDialog() {
dialogBuilder = new AlertDialog.Builder(DataDownloadActivity.this);
LayoutInflater inflater = (LayoutInflater) getSystemService( Context.LAYOUT_INFLATER_SERVICE );
View dialogView = inflater.inflate(R.layout.progress_dialog_layout, null);
dialogBuilder.setView(dialogView);
dialogBuilder.setCancelable(false);
b = dialogBuilder.create();
b.show();
}
public void HideProgressDialog(){
b.dismiss();
}
Oui, ProgressDialog est obsolète, mais Dialog ne l’est pas.
Vous pouvez gonfler votre propre fichier XML (contenant une barre de progression et un texte de chargement) dans votre objet de dialogue, puis l'afficher ou le masquer à l'aide des fonctions show()
et dismiss()
. Voici un exemple (Kotlin):
classe ProgressDialog:
class ProgressDialog {
companion object {
fun progressDialog(context: Context): Dialog{
val dialog = Dialog(context)
val inflate = LayoutInflater.from(context).inflate(R.layout.progress_dialog, null)
dialog.setContentView(inflate)
dialog.setCancelable(false)
dialog.window!!.setBackgroundDrawable(
ColorDrawable(Color.TRANSPARENT))
return dialog
}
}
}
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="match_parent"
Android:background="#fff"
Android:padding="13dp"
Android:layout_height="wrap_content">
<ProgressBar
Android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
Android:layout_width="100dp"
Android:layout_margin="7dp"
Android:layout_height="100dp"
Android:layout_above="@+id/no_jobs_pickups"/>
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_margin="7dp"
Android:layout_toEndOf="@+id/progressBar"
Android:text="Loading..." />
</RelativeLayout>
Dans votre code: Il suffit de faire var dialog = ProgressDialog.progressDialog(context)
Pour montrer: dialog.show()
Pour masquer: dialog.dismiss()
ProgressBar est la meilleure alternative pour ProgressDialog. Un élément d'interface utilisateur qui indique la progression d'une opération.
Pour plus d'informations, consultez ce document Google: https://developer.Android.com/reference/Android/widget/ProgressBar.html
Comme mentionné sur la page de documentation , l'alternative est ProgressBar
. Le look de ProgressDialog
peut être reproduit en plaçant un ProgressBar
dans un AlertDialog
.
Vous pouvez toujours l'utiliser, mais Android ne veut pas que vous l'utilisiez, c'est pourquoi il est obsolète. Vous devriez donc envisager de résoudre votre problème d’une autre manière, comme en intégrant un ProgressBar
dans votre Layout
.
ProgressDialog
était obsolète dans le niveau 26 de l'API.
fait référence à des fonctions ou des éléments en cours de remplacement par des plus récents."Deprecated"
ProgressDialog est une boîte de dialogue modale, qui empêche l'utilisateur d'interagir avec l'application. Au lieu d'utiliser cette classe, vous devez utiliser un indicateur de progression tel que
ProgressBar
, qui peut être intégré à l'interface utilisateur de votre application.
Avantage
Personnellement, je dirais que ProgressBar
a la limite sur les deux. ProgressBar
est un élément d'interface utilisateur qui indique la progression d'une opération. Afficher les barres de progression destinées à un utilisateur de manière non interruptive . Affichez la barre de progression dans l'interface utilisateur de votre application.
Vous pouvez utiliser ceci classe j'ai écrit. Il n'offre que les fonctions de base. Si vous voulez un ProgressDialog entièrement fonctionnel, utilisez ce poids léger bibliothèque .
Ajoutez la dépendance suivante au module/build.gradle:
compile 'com.lmntrx.Android.library.livin.missme:missme:0.1.5'
L'utilisation est similaire à ProgressDialog d'origine
ProgressDialog progressDialog = new
progressDialog(YourActivity.this);
progressDialog.setMessage("Please wait");
progressDialog.setCancelable(false);
progressDialog.show();
progressDialog.dismiss();
NB: vous devez remplacer le onBackPressed()
de l'activité
Implémentation Java8:
@Override
public void onBackPressed() {
progressDialog.onBackPressed(
() -> {
super.onBackPressed();
return null;
}
);
}
Mise en œuvre de Kotlin:
override fun onBackPressed() {
progressDialog.onBackPressed { super.onBackPressed() }
}
J'utilise DelayedProgressDialog de https://github.com/Q115/DelayedProgressDialog Il fait la même chose que ProgressDialog avec l'avantage supplémentaire d'un retard si nécessaire.
Son utilisation est similaire à ProgressDialog avant Android O:
DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
Cela peut aider d'autres personnes.
De nombreuses applications populaires ont une approche différente pour afficher la progression de tout ce qui est comme une requête réseau, un chargement de fichier, etc. Le chargement de spinner n'indique pas la quantité de contenu chargé ou restant à charger. Il y a une période d'incertitude qui est mauvaise dans la perspective d'UI/UX. Beaucoup d'applications populaires (Facebook, Linkedin, etc.) ont résolu ce problème en affichant en premier les affichages de l'interface utilisateur de base. Ensuite, le contenu chargé est progressivement renseigné à l'écran.
J'ai utilisé le chatoiement pour mes applications afin de résoudre ce problème.
Il y a un bon article à ce sujet qui sera bénéfique pour les autres
Peut-être que ceci guide pourrait vous aider.
Habituellement, je préfère créer des AlertDialogs personnalisés avec des indicateurs. Il résout des problèmes tels que la personnalisation de la vue App.
Vous pouvez utiliser SpotDialog en utilisant la bibliothèque wasabeef, vous pouvez trouver le tutoriel complet à partir du lien suivant:
Dans la boîte de dialogue de progression, l'utilisateur ne peut effectuer aucun type de travail. Tous les processus en arrière-plan sont arrêtés pendant le dialogue de progression. Donc, il est conseillé de barre de progression de l'utilisateur au lieu de la boîte de dialogue de progression.