web-dev-qa-db-fra.com

ProgressDialog est obsolète. Quel est l'alternatif à utiliser?

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();
162
Sunil P

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

163
Gowthaman M

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

27
Oussema Aroua

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:

enter image description here

19
Kishan Donga

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.

18
DevMike01

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

13
Syed Naeem

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();
        }
11
Damindu

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()

9
Han

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

6
Furqan

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.

"Deprecated" fait référence à des fonctions ou des éléments en cours de remplacement 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 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.

3
IntelliJ Amiya

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 .

Gradle Setup

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 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() }
}
  • Reportez-vous à exemple d'application pour la mise en œuvre complète
  • Une documentation complète peut être trouvée ici
2
Livin Mathew

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");
1
NinjaCowgirl

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

1
Rajesh Khadka

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.

1
Dmitry Ushkevich

Vous pouvez utiliser SpotDialog en utilisant la bibliothèque wasabeef, vous pouvez trouver le tutoriel complet à partir du lien suivant:

Exemple de SpotsDialog sous Android

0
Ahsan Azwar

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.

0
Nevil Ghelani