ProgressDialog est obsolète. Quelle est l'alternative à utiliser?

215

Je suis tombé sur ce qui ProgressDialogest maintenant obsolète. Quelle serait une alternative à utiliser à la place de cela en dehors ProgressBar. J'utilise la version 2.3.3 d'Android Studio.

ProgressDialog progressDialog=new ProgressDialog(this);
progressDialog.show();
Sunil P
la source
Un doublon possible de ProgressDialog est obsolète
Lalit Jadav

Réponses:

196

Oui, API level 26c'est déprécié. Au lieu de cela, vous pouvez utiliser progressBar.

Pour le créer par programme:

Obtenez d'abord une référence à la disposition 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 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.progressBarStyleSmallen 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 le même

 progressBar.setVisibility(View.VISIBLE); // To show the ProgressBar 
 progressBar.setVisibility(View.INVISIBLE); // To hide the ProgressBar

Voici un exemple d'image de ce à quoi il ressemblerait:

Pour plus de détails:
1. Référence un
2. Référence deux

Gowthaman M
la source
C'est comme si vous l'utilisiez et que vous parlez comme ouais enfin la boîte de dialogue de progression est déconseillée, donc je peux montrer mon potentiel au monde: D, je plaisante, merci beaucoup pour cette réponse détaillée.
Mohamed Hajr
1
mais comment y mettreMessage ()?
reverie_ss
regarde ça ; stackoverflow.com/questions/18410984/…
Gowthaman M
veuillez mettre à jour le code xml en "@android: color / white"
musterjunk
Pour obtenir la barre horizontale, veuillez utiliser: ProgressBar progressBar = new ProgressBar (youractivity.this, null, android.R.attr.progressBarStyleHorizontal); progressBar.setIndeterminate (true);
taranjeetsapra
45

vous pouvez utiliser AlertDialogle ProgressDialogcode ci-dessous pour le ProgressDialog. Cette fonction que 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);
    }
}

Production:

entrez la description de l'image ici

Kishan Donga
la source
Comment le rejeter?
Jay Dangar
1
créer une classe de base comme BaseActivity puis après avoir ajouté ce morceau de code, ajouter également une boîte de dialogue de suppression de méthode mais pour cela, vous devez définir globalement l'objet 'Dialogue AlertDialog'
Kishan Donga
puis appelez simplement la méthode dialog.dismiss () dans votre méthode de dialogue de masquage.
Kishan Donga
1
Tout va bien, mais en appuyant n'importe où sur la boîte de dialogue à l'écran, les appels sont en cours et le service est en mesure de le rejeter et de jouer avec l'interface utilisateur, ce qui n'est pas correct.
Vivek Kumar
Vous pouvez le définir comme non annulable, mais en faisant tourner l'appareil ou en utilisant un écran partagé, il serait de toute façon rejeté et l'utilisateur peut interagir avec l'interface utilisateur qui n'est pas prête. Peut - être AlertDialogne devrait pas être utilisé ici.
Meow Cat 2012
30

Cette classe est déconseillée au niveau de l'API 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 comme ProgressBar, qui peut être intégré dans l'interface utilisateur de votre application. Vous pouvez également utiliser une notification pour informer l'utilisateur de l'avancement de la tâche. lien

Il est obsolète en Android Oraison de la Googlenouvelle norme d'interface utilisateur

Oussema Aroua
la source
1
"Cette classe était obsolète au niveau 26 de l'API" est utilisée à la place d'une date. Ils ne veulent plus que vous l'utilisiez. Oui, c'est à cause des nouvelles normes d'interface utilisateur, mais elles s'appliquent à tous les niveaux d'API ...
creativecreatorormaybenot
28
"Il est déconseillé à Android O en raison de la nouvelle norme d'interface utilisateur de Google" - lien s'il vous plaît nouvelle norme d'interface utilisateur
Ajay S
22
Et la raison de la dépréciation est-elle parce qu'elle bloque l'entrée utilisateur? Parfois, je me demande quel genre de poudre les ingénieurs de Google reniflent. Il est beaucoup plus facile d'utiliser une boîte de dialogue de blocage que de masquer / désactiver les contrôles d'entrée, puis d'activer une barre de progression. Pensée stupide de la part de Google.
TheRealChx101
@ TheRealChx101 L'interface utilisateur Android est conçue pour faire ressentir à l'utilisateur un faux sentiment de liberté au prix de solutions de contournement coûteuses pour éviter les erreurs fatales qui en résultent. Attendez jusqu'à ce que vous obteniez des autorisations et ce que les opérateurs ont payé Google pour dire que vous pouvez et ne pouvez pas accéder.
Panier abandonné le
3
Je suppose qu'ils sont plus intéressés à prévenir l'abus des dialogues modaux: il est parfois démontré qu'ils font attendre l'utilisateur à la fin d'une opération dans des circonstances où l'utilisateur ne devrait pas du tout attendre, mais pourrait continuer à faire d'autres choses , donc les faire attendre dégrade inutilement l'expérience utilisateur. Néanmoins, il existe de nombreuses circonstances dans lesquelles l'utilisateur n'a pas d'autre choix que d'attendre la fin d'une opération.Je conviens donc qu'il devrait y avoir une méthode standard non obsolète pour ces cas au lieu de forcer chaque développeur à implémenter la leur.
Fran Marzoa
26

Vous pouvez simplement concevoir une interface xml pour votre barre de progression et la passer en 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.

  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       private void setDialog(boolean show){
            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 dialogue de progression et passez true comme argument pour l'afficher ou false pour fermer la boîte de dialogue.

DevMike01
la source
2
@Alok Rajasukumaran, il semble que vous utilisiez une activité, remplacez-la simplement par this, afin qu'elle ressemble à ceci AlertDialog.Builder builder = new AlertDialog.Builder(this);. Assurez-vous de copier le bon code.
DevMike01
1
layout_toEndOfpeut être retiré car pas pourLinearLayout
Mark
21

ProgressBar est très simple et facile à utiliser, j'ai l'intention de faire la même chose que la boîte de dialogue de progression simple. la première étape est que vous pouvez créer une disposition xml de la boîte de dialogue que vous souhaitez afficher, disons que nous nommons cette disposition

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>

l'étape suivante consiste à créer AlertDialog qui affichera cette disposition 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 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 c'est tout, cela devrait fonctionner, comme vous pouvez le voir, il est extrêmement simple et facile d'implémenter ProgressBar au lieu de ProgressDialog. vous pouvez maintenant afficher / fermer cette boîte de dialogue dans Handler ou ASyncTask, selon vos besoins

Syed Naeem
la source
Veuillez changer progress_dialog.show();pour builder.show();. Je vous remercie.
Matheus Miranda
2
J'ai changé le nom pour redresser l'objet AlertDialog, show()/ dismiss(), mais je ne l'ai pas mis builder.show()parce que pour le rejeter, nous devions faire dialog.dismiss()ce qui est un peu déroutant pour quelqu'un qui aime garder son code simple et facile à comprendre, et aussi car builder.show()retourne un AlertDialogobjet, et nous devrons enregistrer cette référence comme AlertDialog dialog = builder.show();alors dialog.dismiss(), il est plus facile d'avoir un builder.create()retour dans un AlertDialogobjet, puis d'utiliser cet objet pour afficher et masquer la boîte de dialogue
Syed Naeem
Nous pouvons utiliser "runOnUiThread (new Runnable () {@Override public void run () {dialog.show/dismiss ();}});", si le thread appelant n'est pas le thread d'interface utilisateur principal. (utile lorsque nous utilisons pour appeler à partir de WebView - méthodes shouldoverride.)
SHS
15

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 : faites simplementvar dialog = ProgressDialog.progressDialog(context)

Montrer: dialog.show()

Cacher: dialog.dismiss()

Han
la source
11

Eh bien, si vous voulez vraiment aller à l'encontre de 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();
        }
Ramesh Jaya
la source
2
J'ai eu de terribles expériences avec SweetAlertDialog dans un environnement de production, soyez très prudent car il fuit de fenêtre en fenêtre.
Jeremy
pour moi HideProgressne fait rien.
Saeed Neamati
1
Pourquoi utiliser une bibliothèque juste pour afficher une boîte de dialogue de progression?
Khemraj
6

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

Furqan
la source
16
Il a dit "en dehors de la barre de progression".
creativecreatorormaybenot
6

Vous n'avez pas besoin d'importer de bibliothèque personnalisée.

Je préfère utiliser le moderne AlertDialog, c'est donc la version Kotlin pour l'excellente réponse publiée par Kishan Donga dans cette page.

Code Kotlin:

fun setProgressDialog(context:Context, message:String):AlertDialog {
    val llPadding = 30
    val ll = LinearLayout(context)
    ll.orientation = LinearLayout.HORIZONTAL
    ll.setPadding(llPadding, llPadding, llPadding, llPadding)
    ll.gravity = Gravity.CENTER
    var llParam = LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT,
                  LinearLayout.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    ll.layoutParams = llParam

    val progressBar = ProgressBar(context)
    progressBar.isIndeterminate = true
    progressBar.setPadding(0, 0, llPadding, 0)
    progressBar.layoutParams = llParam

    llParam = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT)
    llParam.gravity = Gravity.CENTER
    val tvText = TextView(context)
    tvText.text = message
    tvText.setTextColor(Color.parseColor("#000000"))
    tvText.textSize = 20.toFloat()
    tvText.layoutParams = llParam

    ll.addView(progressBar)
    ll.addView(tvText)

    val builder = AlertDialog.Builder(context)
    builder.setCancelable(true)
    builder.setView(ll)

    val dialog = builder.create()
    val window = dialog.window
    if (window != null) {
        val layoutParams = WindowManager.LayoutParams()
        layoutParams.copyFrom(dialog.window?.attributes)
        layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT
        layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT
                dialog.window?.attributes = layoutParams
    }
    return dialog
}

Usage:

val dialog = setProgressDialog(this, "Loading..")
dialog.show()

Production:

entrez la description de l'image ici

Alessandro Ornano
la source
comment utiliser en fragment? qu'est-ce que le contexte fragmenté?
roghayeh hosseini
Habituellement, dans votre fragment, vous pouvez obtenir votre vue actuelle, donc le contexte devrait être:view!!.context
Alessandro Ornano
4

Comme mentionné sur la page de documentation, l'alternative est ProgressBar . ProgressDialogLe look peut être reproduit en plaçant un ProgressBardans 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 intégrer un ProgressBardans votre Layout.

creativecreatorormaybenot
la source
@PeterHaddad Cela fonctionne "normalement" dans l'api 28 de mon projet et de la même manière que dans les apis inférieurs. Comme l'indique la dépréciation, elle n'est plus prise en charge et pourrait ne plus fonctionner à l'avenir.
DMonkey
3

ProgressDialog a été déconseillé au niveau 26 de l'API.

"Deprecated" fait référence à des fonctions ou des éléments qui sont en train d'être remplacés par des plus récents.

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 comme ProgressBar, qui peut être intégré dans l'interface utilisateur de votre application.

Avantage

Je dirais personnellement que cela ProgressBara l'avantage sur les deux. ProgressBarest un élément d'interface utilisateur qui indique la progression d'une opération. Affichez les barres de progression à un utilisateur de manière non interruptive . Affichez la barre de progression dans l'interface utilisateur de votre application.

IntelliJ Amiya
la source
2

J'utilise DelayedProgressDialog de https://github.com/Q115/DelayedProgressDialog Il fait la même chose que ProgressDialog avec l'avantage supplémentaire d'un délai si nécessaire.

Son utilisation est similaire à ProgressDialog avant Android O:

DelayedProgressDialog progressDialog = new DelayedProgressDialog();
progressDialog.show(getSupportFragmentManager(), "tag");
NinjaCowgirl
la source
2

Vous pouvez utiliser cette classe que j'ai écrite. Il n'offre que les fonctions de base. Si vous voulez un ProgressDialog entièrement fonctionnel, utilisez cette bibliothèque légère .

Configuration Gradle

Ajoutez la dépendance suivante au module / build.gradle:

compile 'com.lmntrx.android.library.livin.missme:missme:0.1.5'

Comment l'utiliser?

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 les activitésonBackPressed()

Implémentation Java8:

@Override
public void onBackPressed() {
    progressDialog.onBackPressed(
            () -> {
                super.onBackPressed();
                return null;
            }
    );
}

Implémentation de Kotlin:

override fun onBackPressed() {
   progressDialog.onBackPressed { super.onBackPressed() }
}
  • Référez-vous à l' exemple d'application pour l'implémentation complète
  • La documentation complète peut être trouvée ici
Livin Mathew
la source
1

Peut-être que ce 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 de l'application.

Dmitry Ushkevich
la source
1

Cela peut aider d'autres personnes.

De nombreuses applications populaires ont une approche différente pour montrer la progression de quelque chose comme une demande réseau, le chargement de fichiers, etc. Le spinner de chargement n'affiche pas la quantité de contenu chargé ou restant à charger. Il y a une période d'incertitude qui est mauvaise dans la perspective de l'UI / UX. De nombreuses applications populaires (Facebook, Linkedin, etc.) ont résolu ce problème en affichant d'abord l'interface utilisateur nue. Ensuite, le contenu chargé est progressivement rempli à l'écran.

J'ai utilisé le miroitement de mes applications pour résoudre ce problème.

Il y a un bon article à ce sujet qui sera bénéfique pour d'autres personnes

Rajesh Khadka
la source
0

Dans la boîte de dialogue de progression, l'utilisateur ne peut effectuer aucun type de travail. Tous les processus d'arrière-plan sont arrêtés pendant la boîte de dialogue de progression. Il est donc conseillé d'utiliser la barre de progression au lieu de la boîte de dialogue de progression.

Nevil Ghelani
la source